在MVC3中发布后保护模型免受不必要的解析/更新的最佳做法是什么
在HttpGet调用的控制器动作 - >产品/编辑:
public ActionResult Edit()
{
Product p = new Product();
p.Id = 1;
p.Name = "PC";
Category cat = new Category();
cat.Id = 1;
cat.Name = "Non food";
p.Category = cat;
return View(p);
}
这是编辑视图:
@model MvcApplication3.Models.Product
@using (Html.BeginForm("Edit", "Product", FormMethod.Post))
{
@Html.HiddenFor(model => model.Id)
@Html.EditorFor(model => model.Name)
<input type="submit" value="Submit" name="go" />
}
浏览器获得响应后,用户将以下html段插入页面:
<input type="text" value="5" name="Category.Id" id="Category_Id"/>
他发布了表单,以下控制器操作获取“Product”参数。
//
// POST: /Class1/Edit/5
[HttpPost]
public ActionResult Edit(Product p)
{
//Here: p.Company.Id is 5 !!!
db.Save(p);
return null;
}
问题是不应允许用户发布/更新c.Company.Id。 我不想检查整个参数结构寻找不需要的值。 我正在寻求解决问题的最佳实践。
感谢任何帮助!
贝斯茨,
Boolish
答案 0 :(得分:1)
您可以将收到的实体类型(即ViewModel)与持久化的实体类型分离到数据库,如Josh Bush的this recent blog post所述。非常值得阅读 - 也是因为它源于GitHub最近遇到的类似问题。
e.g。
public ActionResult Edit(ProductModel p)
{
// Map ProductModel -> a Product instance
// Then save
}
答案 1 :(得分:1)
这就是为什么你应该在视图中使用视图模型而不是db实体
http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/