1

我创建了一个具有以下域实体的 asp.net 应用程序:

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)

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

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

主要问题

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

4

1 回答 1

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哪些可以大大简化您的域模型和视图模型之间的映射。

于 2013-03-18T08:11:59.970 回答