2010-08-24 2 views
1

J'ai une page d'inscription où l'utilisateur peut entrer son Prénom, Nom, Email et Mot de passe, ainsi que d'autres champs.Mettre à jour seulement une partie d'un modèle, problème de validation?

J'ai lié des attributs de validation à ce modèle (appelé "utilisateur" et créé par LINQtoSQL) et tout fonctionne bien.

Code du modèle:

[MetadataType(typeof(UserValidation))] 
public partial class User { } 

[Bind(Exclude = "UserID")] 
[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirm password don't match.")] 
public class UserValidation 
{ 
    [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Last name required"), StringLength(20, MinimumLength = 3, ErrorMessage = "Must be between 3 and 20 characters")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Email address required"), RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage = "Must be a valid email address")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "Password required"), StringLength(20, MinimumLength = 6, ErrorMessage = "Password must be between 6 and 20 characters")] 
    public string Password { get; set; } 

    [Required(ErrorMessage = "Confirm password required"), StringLength(20, MinimumLength = 6, ErrorMessage = "Password must be between 6 and 20 characters")] 
    public string ConfirmPassword { get; set; } 

} 

Après inscription et connexion, je veux que l'utilisateur de pouvoir modifier leur FirstName, LastName et E-Mail (permet d'appeler ces champs « compte ») dans une vue et " Mot de passe "dans un autre. C'est là que réside mon problème.

Lorsque je soumets un formulaire mettant à jour les données des champs Compte via le même modèle ("Utilisateur") utilisé dans l'inscription, la méthode IsValid fait apparaître une erreur ModelState pour le champ "Mot de passe" manquant.

Code contrôleur:

// 
    // GET /Talent/Account 
    public ActionResult Account() 
    { 
     string cookieUser = User.Identity.Name; 
     User user = userRepository.GetUserByEmail(cookieUser); 
     return View(user); 
    } 

    // POST /Talent/Account 
    [HttpPost] 
    public ActionResult Account(User model) 
    { 

     if (ModelState.IsValid) 
     { 
    // do something 
      ModelState.AddModelError("", "All good.. "+ model.FirstName + " - " + model.LastName); 
     } 

     return View(model); 
    } 

Comment puis-je contourner ce ?? Meilleure pratique etc ...

Répondre

4

En mode Model-View-ViewModel (MVVM), vous devez créer deux ViewModels: un pour créer un nouveau compte et l'autre pour éditer les champs de nom sans le mot de passe requis.

Appliquez les attributs de validation à vos ViewModels plutôt qu'à vos modèles.

Quelques exemples wrapper classes ViewModel:

 [Bind(Exclude = "UserID")]  
     public class UserForAccountEdit 
     { 
      public User UserAccount { get; set; } 

      [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")] 
      public string FirstName 
      { 
       get 
        { return UserAccount.FirstName }; 
       set 
        { UserAccount.FirstName = value; } 
      } 

      ... 
     }  



     [Bind(Exclude = "UserID")] 
     [PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirm password don't match.")] 
     public class UserForAccountCreation 
     { 
      public User UserAccount { get; set; } 

      [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")] 
      public string FirstName 
      { 
       get 
        { return UserAccount.FirstName }; 
       set 
        { UserAccount.FirstName = value; } 
      } 

      ... 
     } 
+0

Merci pour les conseils. Des exemples de code de base sur la façon de l'implémenter? – shahidaltaf

+0

Créez deux classes "wrapper" pour votre classe User L2SQL. L'un est pour la création de compte, l'autre pour l'édition sans le mot de passe requis. Appliquez les attributs de validation à ces classes wrapper au lieu d'utiliser l'attribut Metadata pour les appliquer directement à la classe générée par L2SQL. –

+0

Rend plus de sens, besoin de le voir en action. Avez-vous un exemple de code s'il vous plaît? – shahidaltaf

Questions connexes