none
WCF Validation RRS feed

  • Question

  • Bonjour

    Je voulais savoir s'il était possible d'implémenter la validation des données sur un service WCF.

    J'ai déjà essayé de mettre en place INotifyPropertyChanged. Mais n'ayant pas de résultat, j'ai trouvé une autre astuce.

    Maintenant, j'aimerais bien pouvoir déclencher des erreurs (format, champ obli, ...)

    Le client est une application WPF.


    FB


    mercredi 20 novembre 2013 13:20

Réponses

  • Je travaille avec beaucoup de classe complexe le problème vient d'ici

    JE vais mettre en place finalement la couche model en créant des classes héritées de mes classes WCF sur lesquelles je vais gérer la validation


    FB

    jeudi 21 novembre 2013 15:36

Toutes les réponses

  • Côté interface du WCF,j'ai procédé ainsi :

    Imports System.ComponentModel
    
    <DataContract()> _
    Public Class I_Data
        Implements INotifyPropertyChanged, IDataErrorInfo
    
        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
        Public Sub OnPropertyChanged(propertyName As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End Sub
    
        Public Event Validate(columnName As String, ByRef errorMessage As String)
        Public ReadOnly Property [Error]() As String Implements IDataErrorInfo.Error
            Get
                Throw New NotImplementedException()
            End Get
        End Property
    
        Default Public ReadOnly Property Item(columnName As String) As String Implements IDataErrorInfo.Item
            Get
                Dim errorMessage As String = String.Empty
                RaiseEvent Validate(columnName, errorMessage)
                Return errorMessage
            End Get
        End Property
    End Class
    
    <DataContract> _
    <KnownType(GetType(I_Data))> _
    Public Class I_AxeValeur
        Inherits I_Data
        Private m_idAxeValeur As Long
        <DataMember()> _
        Public Property idAxeValeur As Long
            Get
                Return m_idAxeValeur
            End Get
            Set(value As Long)
                m_idAxeValeur = value
                OnPropertyChanged("idAxeValeur")
            End Set
        End Property
        Private m_idAxe As Long
        <DataMember()> _
        Public Property idAxe As Long
            Get
                Return m_idAxe
            End Get
            Set(value As Long)
                m_idAxe = value
                OnPropertyChanged("idAxe")
            End Set
        End Property
        Private m_idAxeValeurPere As Long
        <DataMember()> _
        Public Property idAxeValeurPere As Long
            Get
                Return m_idAxeValeurPere
            End Get
            Set(value As Long)
                m_idAxeValeurPere = value
                OnPropertyChanged("idAxeValeurPere")
            End Set
        End Property
        Private m_CodeAxeValeur As String
        <DataMember(IsRequired:=True)> _
        Public Property CodeAxeValeur As String
            Get
                Return m_CodeAxeValeur
            End Get
            Set(value As String)
                m_CodeAxeValeur = value
                OnPropertyChanged("CodeAxeValeur")
            End Set
        End Property
        Private m_Nom As Long
        <DataMember()> _
        Public Property Nom As Long
            Get
                Return m_Nom
            End Get
            Set(value As Long)
                m_Nom = value
                OnPropertyChanged("Nom")
            End Set
        End Property
        Private m_Description As Long
        <DataMember()> _
        Public Property Description As Long
            Get
                Return m_Description
            End Get
            Set(value As Long)
                m_Description = value
                OnPropertyChanged("Description")
            End Set
        End Property
        Private m_idPhoto As Long
        <DataMember()> _
        Public Property idPhoto As Long
            Get
                Return m_idPhoto
            End Get
            Set(value As Long)
                m_idPhoto = value
                OnPropertyChanged("idPhoto")
            End Set
        End Property
        Private m_Ordre As Long
        <DataMember()> _
        Public Property Ordre As Long
            Get
                Return m_Ordre
            End Get
            Set(value As Long)
                m_Ordre = value
                OnPropertyChanged("Ordre")
            End Set
        End Property
        Private m_Niveau As Long
        <DataMember()> _
        Public Property Niveau As Long
            Get
                Return m_Niveau
            End Get
            Set(value As Long)
                m_Niveau = value
                OnPropertyChanged("Niveau")
            End Set
        End Property
        Private m_OrdreCalcule As String
        <DataMember()> _
        Public Property OrdreCalcule As String
            Get
                Return m_OrdreCalcule
            End Get
            Set(value As String)
                m_OrdreCalcule = value
                OnPropertyChanged("OrdreCalcule")
            End Set
        End Property
    
        Private Sub On_Validate(columnName As String, ByRef errorMessage As String) Handles Me.Validate
            Select Case columnName
                Case "CodeAxeValeur"
                    If String.IsNullOrEmpty(CodeAxeValeur.Trim) Then
                        errorMessage = "Code obligatoire !"
                    End If
            End Select
    
        End Sub
    End Class

    Puis côté View:

      <TextBox Grid.Row="0" Grid.Column="1" MinWidth="120" 
    			        Text="{Binding c.CodeAxeValeur, Mode=TwoWay, 
                         UpdateSourceTrigger=LostFocus,
                    ValidatesOnDataErrors=true, NotifyOnValidationError=true}"  >
                </TextBox>

    Et enfin côté modelview
        Private WithEvents m_c As I_AxeValeur
        Public Property c As I_AxeValeur
            Get
                Return m_c
            End Get
            Set(value As I_AxeValeur)
                m_c = value
            End Set
        End Property
    
    
        Private Sub OnPropertyChanged(sender As Object, e As ComponentModel.PropertyChangedEventArgs) Handles m_c.PropertyChanged
    
    isDirty = true
    
        End Sub


    FB


    mercredi 20 novembre 2013 13:21
  • Que dois je faire côté client en WPF?

    FB

    mercredi 20 novembre 2013 13:30
  • Bonjour,

    Cet article devrait vous aider :

    http://www.codegod.com/wpf-idataerrorinfo-and-databinding-AID416.aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    mercredi 20 novembre 2013 14:15
    Modérateur
  • J'ai mis à jour le post au dessus pour montrer mon code.

    INotifyPropertyChanged marche : OnPropertyChanged se déclenche

    Par contre, coté IDataErrorInfo, c'est le silence total

    Pouvezvous m'aidr s'il vous plait?


    FB

    mercredi 20 novembre 2013 22:30
  • Bonjour,

    Avez-vous implémenté correctement les propriétés Item et Error (comme dans l'article dont je vous ai fournit le lien) ?. Car en relisant votre code, vous déclenchez une exception dans la propriété Error de votre classe.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 21 novembre 2013 08:18
    Modérateur
  • Dans votre lien on a :

    public string Error
        {
            get { throw new NotImplementedException(); }
        }
    

    De toute façon, en débug, j'ai constaté la chose suivante.

    J'ai dupliqué la classe du service WCF dans le ModelView I_AxeValeurTest

    Via des espions j'ai pu les comparer .

    Voici une copie d'écran de la classe en locale :

    Voici le cas d'une classe du service WCF


    FB


    jeudi 21 novembre 2013 09:01
  • Comme on peut constater propertychangedevent est vide

    Vallidateevent n'existe meme pas

    Alors que le code est identique des 2 cotés.

    Je confirme que le code fonctionne avec I_AxeValeurTest mais pas avec la classe provenant du service WCF I_AxeValeur...


    FB


    jeudi 21 novembre 2013 09:04
  • Je travaille avec beaucoup de classe complexe le problème vient d'ici

    JE vais mettre en place finalement la couche model en créant des classes héritées de mes classes WCF sur lesquelles je vais gérer la validation


    FB

    jeudi 21 novembre 2013 15:36