2013-03-18 141 views
1

我创建了一个asp.net应用程序与以下域实体:Asp.net 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; } 
} 

与视图模型

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

现在我有一个要求输入一个形式的人的细节以及购买的物品(如果有)

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) 

最后在控制器中,我要添加项目(如果它是给n由用户)添加到集合中。

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

主要问题

现在,如果不给项目名称的价值,它给了我“这个名字字段是必需”的验证错误。但是我想仅删除此表单的项目对象属性的验证。我怎样才能做到这一点?

回答

3

您应该使用视图模型。视图模型是专门为满足视图要求而设计的类。在这个视图中,你似乎有一个要求,名称不是必需的。因此,设计一个视图模型:

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

和:

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

,你是好去。该name将不再需要这种形式。

此外,我建议你检查出AutoMapper这样可以大大简化您的域模型和视图模型之间的映射。