2011-02-04 6 views
1

Mon modèle contient deux objets (Rappels et utilisateurs). Chaque rappel est associé à un utilisateur.Validation ViewModel avec modèles imbriqués

public class Reminder 
    { 
    [DisplayName("Subject")] 
    [Required(ErrorMessage = "{0}: error message.")] 
    [StringLength(200, ErrorMessage = "{0}: error message.")] 
    public string Name { get; set; } 

    [DisplayName("Supervisor")] 
    public User DepartmentSupervisor { get; set; } 
    } 

public class User 
    { 
    [DisplayName("Username")] 
    [Required(ErrorMessage = "{0}: error message.")] 
    [StringLength(25, ErrorMessage = "{0}: lerror message.")] 
    public string Username { get; set; } 

    [DisplayName("Email")] 
    [StringLength(50, ErrorMessage = "{0}: error message.")] 
    [Email(ErrorMessage="Not valid.")] 
    public string Email { get; set; } 
    } 

J'ai défini un viewmodel-je utiliser pour transmettre des données à mon avis:

public class RemindersViewModel 
    { 
     public RemindersViewModel() 
     { 
      this.Supervisors = new List<SelectListItem>(); 
     } 
     public Models.Reminder Reminder { get; set; } 
     public List<SelectListItem> Supervisors { get; set; } 
    } 

superviseurs est une liste d'utilisateurs (SelectListItem) j'utiliser pour rendre un combo.
Quand je soumets la forme du contrôleur reliaisons l'objet Rappel:

public ActionResult Edit(Guid id, Models.Reminder Reminder) 
{ 
    if (!ModelState.IsValid) 
    { 
    // PROBLEM. 
    } 
} 

Tout fonctionne bien et j'ai mon rappel associé à l'utilisateur choisie (nom d'utilisateur) mais, depuis que je ne dois pas montrer l'e-mail à la liste déroulante, la liaison ne peut pas remplir le champ, car elle n'existe pas dans mon formulaire. Dans le processus de validation, j'obtiens une erreur car il essaie de valider le modèle User, ce qui n'est pas ce que je veux vraiment. Quelle est la meilleure approche concernant les modèles imbriqués?

Répondre

1

Avez-vous envisagé d'utiliser des modèles de vue? Ils incluent uniquement les propriétés requises par votre vue et la validation pour cette vue particulière. Donc, si votre vue ne nécessite pas d'e-mail, vous écrivez un modèle de vue sans e-mail et la validation est réussie. Ensuite, à l'intérieur de votre action de contrôleur, vous mappez ce modèle de vue au modèle de domaine correspondant. AutoMapper est un excellent outil pour ce travail.

+0

Merci pour votre réponse Darin. Autant que je peux comprendre vous suggérez d'aplatir mon viewmodel ?! Mon classeur aurait une propriété DepartmentSupervisor qui n'est pas de type User ... est-ce exact? Avez-vous des exemples? – LeftyX

+0

@vandalo, pas nécessairement aplatir. Vous pouvez donc avoir un 'ReminderViewModel' et un' UserViewModel' contenant chacun uniquement les propriétés que vous utiliseriez dans cette vue particulière. Le ReminderViewModel aura alors une propriété de type UserViewModel. –

+1

Je commence à comprendre. Le penser c'est que j'ai mes classes de domaine (entités). Ensuite, j'ai créé des classes intermédiaires (rappel, utilisateur, etc.) avec des règles de validation et j'imprime ces classes dans mon ViewModel. Pour ce que je peux comprendre, je devrais me débarrasser de la classe intermédiaire et avoir juste des entités (domaine) et des modèles de vue. Est ce bien? – LeftyX