2

在 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"/>

他发布表单,以下控制器操作获取“产品”参数。

    //
    // POST: /Class1/Edit/5

    [HttpPost]
    public ActionResult Edit(Product p)
    {
      //Here: p.Company.Id is 5    !!!
      db.Save(p);
      return null;
    }

问题是不应允许用户发布/更新 c.Company.Id。我不想检查整个参数结构以寻找不需要的值。我正在寻求解决问题的最佳实践。

任何帮助表示赞赏!

最好的,

布尔什

4

2 回答 2

1

您可以将接收到的实体类型(即 ViewModel)与持久保存到数据库的实体类型分开,如Josh Bush最近的博客文章中所述。非常值得一读 - 也很热门,因为它源于 GitHub 最近遇到的类似问题。

例如

public ActionResult Edit(ProductModel p)
{
    // Map ProductModel -> a Product instance
    // Then save
}
于 2012-03-07T11:42:34.280 回答
1

这就是为什么您应该在视图中使用视图模型而不是数据库实体

http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

于 2012-03-07T11:47:51.103 回答