2013-03-18 1 views
1

J'ai créé une application asp.net avec les entités suivantes de domaine:Asp.net validation profonde mvc

public class Person 
{ 
    [Required] 
    public string name { get; set; } 
    public string address { get; set; } 
    public ICollection<Item> ItemsPurchased { get; set;} 
} 

public class Item 
{ 
    [Required] 
    public string name { get; set; } 
    public int price { get; set; } 
} 

avec viewmodel

public class PersonViewModel 
{ 
    public Person Entity { get; set; } 
    public Item ItemPurchased { get; set; } 
} 

Maintenant, j'ai est une forme qui demande d'entrer une personne détails ainsi que des articles achetés (le cas échéant)

Html.Label("Person Name") 
Html.TextboxFor(model => model.Entity.name) 
Html.ValidationMessageFor(model => model.Entity.name) 


Html.Label("Item Name") 
Html.TextboxFor(model => model.ItemPurchased.name) 
Html.ValidationMessageFor(model => model.ItemPurchased.name) 


Html.Label("Item Price") 
Html.TextboxFor(model => model.ItemPurchased.Price) 
Html.ValidationMessageFor(model => model.ItemPurchased.Price) 

Et enfin dans le contrôleur, je vais ajouter l'article (si elle est de donner n par l'utilisateur) à la collection.

if(!this.ModelState.IsValid) 
{ 
    //Return the view with validation errors 
} 

Problème principal

Maintenant, si ne donne pas la valeur du nom de l'élément, il me donne une erreur de validation « Le champ de nom est nécessaire ». Mais je veux supprimer la validation sur les attributs d'objet d'élément pour ce formulaire seulement. Comment puis je faire ça?

Répondre

3

Vous devez utiliser un modèle de vue. Les modèles de vue sont des classes spécialement conçues pour répondre aux exigences de la vue. Dans cette vue, vous semblez avoir une exigence que le nom n'est pas requis. conception Donc un modèle de vue:

public class EditItemViewModel 
{ 
    public string name { get; set; } 
    public int price { get; set; } 
} 

et:

public class EditPersonViewModel 
{ 
    public Person Entity { get; set; } 
    public EditItemViewModel ItemPurchased { get; set; } 
} 

et vous êtes bon pour aller. Le name ne sera plus requis pour ce formulaire.

Aussi, je vous recommande de vérifier AutoMapper ce qui pourrait grandement simplifier le mappage entre vos modèles de domaine et vos modèles de vue.