Asp.net mvc ASP.NET MVC 2使用POST创建模型

Asp.net mvc ASP.NET MVC 2使用POST创建模型,asp.net-mvc,entity-framework,validation,Asp.net Mvc,Entity Framework,Validation,我有以下型号: public class Product { public int Id { get; set; } public string Name { get; set; } private int CategoryId { get; set; } public Category Category { get; set; } public string InventoryDetails { get; set; } } 我的控制器中有一个用于创建新产品的操作。我的问题是如何限制

我有以下型号:

public class Product {
 public int Id { get; set; }
 public string Name { get; set; }
 private int CategoryId { get; set; }
 public Category Category { get; set; }
 public string InventoryDetails { get; set; }
}
我的控制器中有一个用于创建新产品的操作。我的问题是如何限制可以从POST数据绑定的模型的属性?因为我只希望名称和CategoryId由用户POST数据绑定。还是最好创建一个单独的viewmodel,其中只有这些可以绑定的属性

public ActionResult Create(Product p)

在哪里


使用视图模型。这将使视图与数据模型分离。正如您所发现的,它们并不总是有相同的需求,模型应该特定于视图。您可以手动映射属性或用于更复杂的场景。

或者您可以执行以下操作:

public ActionResult Create (FormCollection collection) {
    Product p = new Product();
    UpdateModel(p, new string[] { "Name", "CategoryId" });
    //....
}

始终使用ViewModel。使用ViewModel,根据视图的需要弯曲数据模型要容易得多。这是吉米·博加德写的一篇很酷的文章

ASP.NET MVC默认模型绑定器将排除不必要的字段


注意:如果视图数据格式几乎等于数据模型,则创建单独的视图模型不是一个好做法。仅当两个视图模型不同时才创建单独的视图模型。

但是由于使用了“魔术”字符串,您已经失去了可重构性和类型安全性。实际上,如果需要,您可以始终枚举它们或将它们保存在常量变量中。我只是提供一些选择。
public class CreateProductViewModel {
 public string Name {get; set;}
 public int CategoryId {get;set;}
}
public ActionResult Create (FormCollection collection) {
    Product p = new Product();
    UpdateModel(p, new string[] { "Name", "CategoryId" });
    //....
}
public ActionResult Create([Bind(Exclude = "Category,Id,InventoryDetails")]Product prod){

/*do your magic*/

}