IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

RIA et Validation, empêcher l'insert d'un objet non validé


Sujet :

Silverlight

  1. #1
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut RIA et Validation, empêcher l'insert d'un objet non validé
    Bonjour à tous,

    J'essaye d'implémenter la validation sur un petit formulaire d'ajout. J'ai donc un Grid contenant toutes les textbox, datepicker ... Bindés sur mon objet à insérer. Quand je met un string dans la textbox à la place d'un int j'ai bien l'erreur en rouge qui apparaît avec le texte mais rien ne m’empêche d'ajouter quand même mon Objet (mal constitué) à mon DataContext, ce qui fait que bien sur l'ajout plante du coté serveur, or la validation devrai rester coté clients non ?

    Y'a t-il un moyen de détecter si oui ou non la constitution de l'objet est bonne ? Je veux dire, graphiquement on voit bien que l'erreur est levée mais comment savoir si il reste des erreur sur l'objet avant de l’insérer en base ?

    Cordialement MoZo

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Bonjour,
    place ton formulaire dans un Dataform, abonne toi ensuire au EditEnded pour regarder si ton entite est valide ou non.

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Comme dit le schtroumpf grognon: moi j'aime pas le dataform ! (surtout parce que je capte pas tout de la mécanique du beginedit/endedit)
    Par contre j'ai trouvé sur le blog de Jonathan Antoine ce petit bout de code qui me sert à appeler la validation côté client.

    Ensuite je me suis même fait une petite méthode d'extension côté client, qui me permets d'appeler ce code sur n'importe quelle entité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    using System.ComponentModel;
     
    namespace System.ServiceModel.DomainServices.Client
    {
        public static class EntityValidationExtension
        {
     
            public static bool Validate(this Entity entity_to_validate)
            {
                return ValidationHelper.ValidateItem(entity_to_validate);
            }
        }
    }

    A+

  4. #4
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Merci de vos réponse,

    Y'a t-il moyen d'utiliser un Dataform mais sans que les champs soit générés de manière automatique ?

    Ils y a des champs que je veux laisser invisibles, des liaisons à d'autres entités que je veux réaliser à l'aide de ComboBox plutôt que de devoir rentrer l'id...

    Sinon chrisdot, pour le bout de code de Jonathan je vois pas trop ce que c'est que le "out ICollection<ValidationResult> validationResults"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public static bool ValidateItem(Entity dataToValidate, 
          out ICollection<ValidationResult> validationResults)
    {
      if (dataToValidate == null) 
         throw new ArgumentNullException("dataToValidate");
     
      validationResults = new List<ValidationResult>();
      ValidationContext context = new ValidationContext(dataToValidate, null, null);
      Validator.TryValidateObject(dataToValidate, context, validationResults, true);
      dataToValidate.ValidationErrors.Clear();
      foreach (var res in validationResults)
      {
          dataToValidate.ValidationErrors.Add(res);
      }
      return validationResults.Count == 0;
    }

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Pour ce qui est du dataform, oui tu peux préciser son layout... Tu peux d'inspirer de cet article..

    Sinon, pr l'autre point, c'est le "out" le problème? A ce moment là, c'est juste une question de C#. Vois ici.


    A+

  6. #6
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Ok merci, mais là du coup il faut que je lui passe un "ICollection<ValidationResult>" que j'aurai moi même créé ?

    Car j'ai réussi à ajouter la méthode d'extension mais elle me renvoi toujours true.

    Pour ta méthode j'ai été obliger de changer car la fonction de Jonathan prend 2 arguments (mais c'est surement ça qui fait rater la fonction):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static class EntityValidationExtension
        {
            public static bool Validate(this Entity entity_to_validate)
            {
                ICollection<ValidationResult> a;
                return ValidationHelper.ValidateItem(entity_to_validate, out a);
            }
        }

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Oui désolé, muavais cut/patse, j'avais pas mis tout le code, dans mon helper j'avais déjà la fonction manquante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        public class ValidationHelper
        {
            //Taken from: http://blog.lexique-du-net.com/index.php?post/2010/10/19/RIA-Services-Force-validation-on-my-entities-%28and-just-the-validation-!%29
            public static bool ValidateItem(Entity dataToValidate, out ICollection<ValidationResult> validationResults)
            {
     
     
                if (dataToValidate == null)
                    throw new ArgumentNullException("dataToValidate");
     
     
                validationResults = new List<ValidationResult>();
     
                ValidationContext context = new ValidationContext(dataToValidate, null, null);
     
                Validator.TryValidateObject(dataToValidate, context, validationResults, true);
     
                dataToValidate.ValidationErrors.Clear();
     
                foreach (var res in validationResults)
                {
     
                    dataToValidate.ValidationErrors.Add(res);
     
                }
     
                return validationResults.Count == 0;
     
            }
     
            public static bool ValidateItem(Entity dataToValidate)
            {
                ICollection <ValidationResult> res;
     
                return ValidateItem(dataToValidate, out res);
            }
     
        }
    Mais si ça renvoie true c'est qu'il y a pas d'erreur... Ou alors que tu n'as pas appliqué les bonnes contraintes??

  8. #8
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Pourtant graphiquement l'erreur est bien levée c'est étrange, j'ai ma textbox qui s'encadre en rouge et tout.

    J'ai un Grid avec un Datacontext Binder sur une Depedency Porperty, et les champs de mon grid sont Bindés sur les propriété de ma DP

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
      <Grid Grid.Column="0" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
     
                <Grid Grid.Column="0" HorizontalAlignment="Stretch" Name="Grid_Box" VerticalAlignment="Stretch" DataContext="{Binding Path=NewBOX,Mode=TwoWay}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="130" />
                        <ColumnDefinition Width="130" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="30" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
     
                    <sdk:Label Content="BOX IMEI:" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
                    <TextBox Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Left" Margin="3" Name="bOX_IMEITextBox" Text="{Binding Path=BOX_IMEI, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}"  VerticalAlignment="Center" Width="120" />
     
                    <sdk:Label Content="BOX PROVIDER:" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
                    <TextBox Grid.Column="1" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="3"  Name="bOX_PROVIDERTextBox" Text="{Binding Path=BOX_PROVIDER, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}" VerticalAlignment="Center" Width="120" />
     
                    <sdk:Label Content="BOX SERIALNUMBER:" Grid.Column="0" Grid.Row="5" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
                    <TextBox Grid.Column="1" Grid.Row="5" Height="23" HorizontalAlignment="Left" Margin="3" Name="bOX_SERIALNUMBERTextBox" Text="{Binding Path=BOX_SERIALNUMBER, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=0}" VerticalAlignment="Center" Width="120" />
     
                    <sdk:Label Content="BOX SIMCAR:" Grid.Column="0" Grid.Row="6" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
                    <TextBox Grid.Column="1" Grid.Row="6" Height="23" HorizontalAlignment="Left" Margin="3" Name="bOX_SIMCARTextBox" Text="{Binding Path=BOX_SIMCAR, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}" VerticalAlignment="Center" Width="120" />
                </Grid>

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    C'est bien à l'appel de la méthode Validate() que les champs sont validés?

  10. #10
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Désolé je ne comprend pas ta question

    En fait ce formulaire sert pour ajouter une BOX en Base, donc avant le click sur le bouton ajouter je test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if (NewBOX.Validate())
    {
          //Ajout en base
    }

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    La question c'est: c'est bien à ce moment là que tes champs passent en rouge? Ou c'est autre chose qui déclenche ça?
    Sinon, c'est de la validation syncrhone/locale ou asynchrone avec envoi d'une requete au serveur?

  12. #12
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Oui c'est à ce moment là, je dirai que c'est en local, sans appel au serveur. Quand je met du texte dans un champs pour integer (exemple champs BOX_SERIALNUMBER), quand j'enlève le focus de la textbox il me l'encadre en rouge et me met un message comme quoi l'entrée n'est pas dans un format correcte.

  13. #13
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Oui, donc ça n'a rien à voir avec l'appel de la nouvelle méthode Validate(), c'est quand tu sors du champs...
    Alors, avant d'enregistrer, essaies:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (NewBOX.HasValidationErrors == false)
    {
          //Ajout en base
    }

  14. #14
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Ok mça marche merci Beaucoup !!

  15. #15
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Ok! Mais as-tu testé le cas où ton utilisateur ne fait rien du tout lors de l'ajout (ne remplit rien) et passe directement sur le bouton save ?

  16. #16
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    A ouai non, du coup tant qu'il n'y a pas une 1ère modif, l'erreur n’apparaît pas...

    Par exemple pour un champ required, il faut ecrire quelque chose dedans puis supprimer le contenu pour que l'erreur soit levé...

    Pas terrible

  17. #17
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Bin du coup tu reprends mon bout de code et tu fais qque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NewBOX.Validate();
    if (NewBOX.HasValidationErrors == false)
    {
          //Ajout en base
    }
    C'est à ça que ça servait et c'est comme ça que j'avais compris ta question initialement !!

  18. #18
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Ok merci je test tout ça

  19. #19
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Perfect !!!

    Un grand merci à toi chrisdot !! Vraiment !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] "Nom d'objet non valide"
    Par BleuTrèsFoncé dans le forum Accès aux données
    Réponses: 1
    Dernier message: 05/03/2013, 17h35
  2. Nom d'objet non valide
    Par sleeg dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 18/10/2011, 12h32
  3. Trigger INSERT : nom de colonne non valide
    Par arthuro45 dans le forum Développement
    Réponses: 6
    Dernier message: 13/09/2010, 21h58
  4. Réponses: 5
    Dernier message: 23/06/2009, 14h05
  5. Nom d'objet non valide
    Par dvi24 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/04/2008, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo