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*/
}