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 services validation


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 services validation
    Bonjour à tous,
    Il y peu j'ai décidé de me mettre au RIA services j'ai donc suivi le superbe tuto réalisé par Davrous.

    J'ai cependant un léger problème au niveau de la validation, je m'explique J'ai une childWindows qui est en fait un formulaire de création de User (je met juste le formulaire):
    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
    40
    41
    42
     
    <Grid x:Name="LayoutRoot" Background="White">
    		<Grid.RowDefinitions>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="30"></RowDefinition>
                <RowDefinition Height="36"></RowDefinition>
    		</Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="140"></ColumnDefinition>
                <ColumnDefinition Width="249"></ColumnDefinition>
            </Grid.ColumnDefinitions>
     
    		<TextBlock Height="25" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="0" VerticalAlignment="Top" Width="130" Foreground="Black" Text="Name :" TextAlignment="Right" TextWrapping="Wrap"/>
    		<TextBox x:Name="Tb_Name" Text="{Binding User_Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" Height="25" Grid.Column="1" Grid.Row="0" VerticalAlignment="Top" TextWrapping="Wrap" Margin="0,0,8,0"/>
     
            <TextBlock Height="25" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="1" VerticalAlignment="Top" Width="130" Text="First Name :" TextWrapping="Wrap" Foreground="Black" TextAlignment="Right"/>
    		<TextBox x:Name="Tb_FirstName" Text="{Binding User_FirstName,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" Height="25" Grid.Column="1" Grid.Row="1" VerticalAlignment="Top" TextWrapping="Wrap" Margin="0,0,8,0"/>
     
            <TextBlock HorizontalAlignment="Left" Grid.Column="0" Grid.Row="2" Width="130" Text="Password :" TextWrapping="Wrap" Foreground="Black" TextAlignment="Right" Height="25" VerticalAlignment="Bottom"/>
    		<TextBox x:Name="Tb_Password" Text="{Binding User_Password,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" Grid.Column="1" Grid.Row="2" TextWrapping="Wrap" Height="25" VerticalAlignment="Top" Margin="0,0,8,0"/>
     
            <TextBlock HorizontalAlignment="Left" Grid.Column="0" Grid.Row="3" Width="130" Text="Confirm Password :" TextWrapping="Wrap" Foreground="Black" TextAlignment="Right" Height="25" VerticalAlignment="Bottom"/>
    		<TextBox x:Name="Tb_ConfirmPassword" Grid.Column="1" Grid.Row="3" TextWrapping="Wrap" Height="25" VerticalAlignment="Top" Margin="0,0,8,0"/>
     
            <TextBlock HorizontalAlignment="Left" Grid.Column="0" Grid.Row="4" Width="130" Text="Mail :" TextWrapping="Wrap" Height="25" VerticalAlignment="Bottom" Foreground="Black" TextAlignment="Right"/>
    		<TextBox x:Name="Tb_Mail" Grid.Column="1" Grid.Row="4" TextWrapping="Wrap" Height="25" VerticalAlignment="Top" Margin="0,0,8,0"/>
     
            <TextBlock HorizontalAlignment="Left" Grid.Column="0" Grid.Row="5" Width="130" Text="Confirm Mail :" TextWrapping="Wrap" Foreground="Black" TextAlignment="Right" Height="25" VerticalAlignment="Top"/>
    		<TextBox x:Name="Tb_ConfirmMail" Grid.Column="1" Grid.Row="5" TextWrapping="Wrap" Height="25" VerticalAlignment="Top" Margin="0,4,8,0"/>
     
            <TextBlock x:Name="Lb_ID" Height="25" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="6" VerticalAlignment="Top" Width="130" Text="ID (for login) :" TextWrapping="Wrap" Foreground="Black" TextAlignment="Right"/>
    		<TextBox x:Name="Tb_ID" Text="{Binding User_Identifiant,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" Height="25" Grid.Column="1" Grid.Row="6" VerticalAlignment="Top" TextWrapping="Wrap" Margin="0,4,8,0"/>
     
            <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="121" Height="23" HorizontalAlignment="Left"  Grid.Column="1" Grid.Row="7" VerticalAlignment="Bottom" d:LayoutOverrides="Height" Margin="0,0,0,6" />
            <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="116" Height="23" HorizontalAlignment="Right"  Grid.Column="1" Grid.Row="7" VerticalAlignment="Bottom" d:LayoutOverrides="Height" Margin="0,0,8,6" />
     
        </Grid>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public User CreatingUser { get; set; }
            public CreateUserChildWindow()
            {
                InitializeComponent();
                CreatingUser = new User();
                LayoutRoot.DataContext = CreatingUser;
            }
    Ensuite dans mes metadata j'ai défini des règles de validation comme ceci :

    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
     
    [MetadataTypeAttribute(typeof(User.UserMetadata))]
        public partial class User
        {
      internal sealed class UserMetadata
            {
     
                // Metadata classes are not meant to be instantiated.
                private UserMetadata()
                {
                }
     
                public EntityCollection<Category> Category;
     
                [Required(ErrorMessage = "Required attribute")]
                public string User_FirstName;
     
                public int User_ID;
     
                [Required(ErrorMessage = "Required attribute")]
                public string User_Identifiant;
     
                [Required(ErrorMessage = "Required attribute")]
                public string User_Name;
     
                [Required(ErrorMessage="Required attribute")]
                public string User_Password;
            }
        }
    Si je rentre quelque chose dans la textbox et qu'ensuite je supprime son contenu, l'exception est bien levé, mais si je rentre pas dans la textbox alors l'utilisateur se créer mais bien sure cela plante car les regle de validation ne sont pas respecté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void OKButton_Click(object sender, RoutedEventArgs e)
            {
     
                App.MonFavorisHomePageContext.Users.Add(CreatingUser);
                App.MonFavorisHomePageContext.SubmitChanges();
     
     
                this.DialogResult = true;
            }
    j'obtien l'erreur suivante :
    Erreur : Unhandled Error in Silverlight Application
    Code: 4004
    Category: ManagedRuntimeError
    Message: System.Windows.Ria.DomainOperationException: Submit operation failed validation. Please inspect Entity.ValidationErrors for each entity in EntitiesInError for more information.
    à System.Windows.Ria.OperationBase.Complete(Exception error)
    à System.Windows.Ria.SubmitOperation.Complete(OperationErrorStatus errorStatus)
    à System.Windows.Ria.DomainContext.<>c__DisplayClassb.<SubmitChanges>b__3(Object )

    Fichier source : http://localhost:1043/FavorisHomePageTestPage.aspx
    Ligne : 56
    Sinon je n'arrive pas a créer des classes "Shared" je rajoute bien l'extension shared.cs a mes classes mais l'attribut [shared] n'est pas accepter. Pourtant la classe est bien copié coté client. Me manque t -il un using ?

    Merci a tous, Cordialement MoZo

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Tu as essayé de suivre le message d'erreur pour voir ce cela disait:

    Submit operation failed validation. Please inspect Entity.ValidationErrors for each entity in EntitiesInError for more information.

  3. #3
    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
    Le problème c'est qu'il ne passe pas dans mon try catch même lorsque cela plante :

    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
     
    if (Tb_ConfirmMail.Text == "" || Tb_ConfirmPassword.Text == "" || Tb_FirstName.Text == "" || Tb_ID.Text == "" || Tb_Mail.Text == "" || Tb_Name.Text == "" || Tb_Password.Text =="")
                {
                    AlertChildWindow MonAlertChildWindow = new AlertChildWindow("All fields must be complete !");
                }else
                {
                    try
                    {
                        App.MonFavorisHomePageContext.Users.Add(CreatingUser);
                        App.MonFavorisHomePageContext.SubmitChanges();
                        this.DialogResult = true;
                    }
                    catch (Exception ex)
                    {
     
                    }
               }
    Du coup j'ai été obliger de faire un test


    Sinon, j'ai bien compris que tous s'effectue en asynchrone même si cela est transparents. Cela me pose un problème lorsque par exemple j'essaye de créer une liste de mes Users par exemple mais pas au travers d'un composant graphique. Imaginons que mon user veuille se loguer, je doit verifier dans la base si son couple login/Password existe dans la base je fait donc comme ça :

    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
    var ListeUsers = App.MonFavorisHomePageContext.Users;
     
                App.MonFavorisHomePageContext.Load(App.MonFavorisHomePageContext.GetUserQuery());
     
                if (Tb_Login.Text == "" || Tb_Password.Text == "")
                {
                    AlertChildWindow MonAlertChildWindows = new AlertChildWindow("All fields must be complete !");
                }
                else
                {
                    try
                    {
                        var UserConnected = (from User in ListeUsers where User.User_Identifiant == Tb_Login.Text where User.User_Password == Tb_Password.Text select User).Single();
                        App.SetUserConnect(UserConnected);
                    }
                    catch (Exception)
                    {
                        AlertChildWindow MonAlertChildWindows = new AlertChildWindow("User not found, please try again !");
                        Tb_Password.Text = "";
                    }
                }
    Le problème est listeUsers est toujours vide car a mon avis le chargement en asynchrone n'a pas encore effectué. Comment faire alors ? Je ne voit pas d'evenement loaded... Je crois qu'il y a quelque chose dans le fonctionnement de cette techno qui m'echappe..

    Edit : bon j'ai finalement trouvé une solution en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    App.MonFavorisHomePageContext.Load(query).Completed += new EventHandler(Login_Completed);
    Edit2 : pour le [shared] en faite il n'est plus nécessaire de la préciser que dans l'extension du fichier (cf http://forums.silverlight.net/forums)/p/127616/287402.aspx#287402


    Merci a tous, Cordialement MoZo

  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
    J'ai toujours un problème qui persiste et qui viens lorsque j'essaye de créer des ValidationAttribute.

    Par exemple, je créé une classe comme ceci, nommer StringHttpBegin.shared.cs qui est sensé tester si le début d'un url est correcte :

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.Windows.Ria;
     
    namespace FavorisHomePage.Web
    {
        public class StringHttpBegin : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                if (value.ToString().Substring(0,7)!="http://" && value.ToString().Substring(0,8)!="https://")
                {
                    return false;
                }
                return true;
            }
        }
    }
    Du coté du serveur (.web) il n'y pas de pb, mais lorsque je fait un rebuild, il copie donc le fichier sur la partie client et là, la fonction IsValid n'est pas reconnu. Il me met l'erreur (impossible de compiler) :
    'FavorisHomePage.Web.StringHttpBegin.IsValid(object)': no suitable method found to override
    J'ai une classe autre classe User.shared.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    namespace FavorisHomePage.Web
    {
     
        public partial class User
        {
            public string FullName {
                get { return this.User_Name + " " + this.User_FirstName; }
            }
        }
    }
    qui elle fonctionne très bien et est bien dupliqué coté client.

    Je ne comprends pas trop d'ou peut venir mon erreur ?

    Merci de votre aide, Cordialement MoZo

  5. #5
    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
    Cela pourrait-il venir du fait que j'utilise le template Navigation Application et pas Business Application ?

    Cordialement MoZo

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/09/2011, 17h21
  2. Réponses: 6
    Dernier message: 01/11/2009, 08h20
  3. .Net RIA Services et les règles de Validations
    Par Steven62 dans le forum Silverlight
    Réponses: 4
    Dernier message: 26/08/2009, 15h08
  4. Silverlight 3, RIA Services - En Prévision..
    Par 3KyNoX dans le forum Silverlight
    Réponses: 4
    Dernier message: 17/07/2009, 13h49
  5. XMLParserexection dans DomaiDataSource (.NET Ria Service)
    Par bleuerouge dans le forum Silverlight
    Réponses: 1
    Dernier message: 22/06/2009, 03h43

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