在MVC3中发布后保护模型的最佳实践



在MVC3 中发布后,保护模型免受不必要的解析/更新的最佳做法是什么

在HttpGet->Product/Edit:调用控制器操作

 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

您可以将接收到的实体类型(即ViewModel)与持久化到数据库中的实体类型分开,正如Josh Bush最近的博客文章中所描述的那样。值得一读——这也是一个话题,因为它源于GitHub最近遇到的类似问题。

例如

public ActionResult Edit(ProductModel p)
{
    // Map ProductModel -> a Product instance
    // Then save
}

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

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

相关内容

  • 没有找到相关文章

最新更新