【问题标题】:When and why do you use TryUpdateModel in asp.net mvc 2?您何时以及为什么在 asp.net mvc 2 中使用 TryUpdateModel?
【发布时间】:2011-03-11 02:45:04
【问题描述】:

我似乎无法找到一个基本的代码示例来了解 TryUpdateModel 的工作原理?你什么时候使用它,为什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    您可以使用此方法通过给定的控制器更新支持特定视图的模型。例如,如果我有一个显示 Foo 对象的视图,该对象的属性 Bar 由文本框填充,我可以在控制器上调用方法 Save() 并调用 TryUpdateModel 以尝试更新 Foo。

    public class Foo {
      public string Bar { get; set; }
    }
    
    // ... in the controller
    public ActionResult Save() {
      var myFoo = new Foo();
      TryUpdateModel(myFoo);
    }
    

    这将尝试使用给定的 Bar 值更新模型。如果更新验证失败(例如,Bar 是一个整数,并且文本框中包含文本“hello”),那么 TryUpdateModel 将通过验证错误传递更新 ViewData ModelState,并且您的视图将显示验证错误。

    请务必密切注意 MSDN 文档中针对 .NET Framework 4 的安全警告:

    安全说明使用其中一种 [重载:System.Web.Mvc.Controller.TryUpdateModel``1] 采用以下任一列表的方法 要包括的属性(白名单)或 要排除的属性列表(a 黑名单)。如果没有明确的白名单 或黑名单通过,则 [重载:System.Web.Mvc.Controller.TryUpdateModel`1] 方法尝试更新每个公共 模型中的属性 是对应的值 要求。恶意用户可以 利用它来更新 您不打算使用的属性 提供访问权限。

    https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryupdatemodel(v=vs.100).aspx

    【讨论】:

    • +1 用于包含有关批量分配的安全警告。这个漏洞在大多数 MVC 框架中都很常见,并且是 GitHub 被盗的原因 (extremetech.com/computing/…)。
    • 当您不使用 TryUpdateModel 时,该漏洞也同样适用。不依赖 TryUpdateModel 时也可以指定白名单:public ActionResult ActionName([Bind(Include="FieldName"] Model) 或黑名单 public ActionResult ActionName([Bind(Exclude="FieldName"] Model)。@ 987654323@
    【解决方案2】:

    TryUpdateModel() 允许您将参数绑定到您的动作中的模型。如果您想从数据库加载模型然后根据用户输入更新它,而不是从用户输入中获取整个模型,这将非常有用。

    public ActionResult Update(int id) {
        var service = new ServiceClass();
        var record = service.LoadModel(id);
        if (!TryUpdateModel(record)) {
            // There was an error binding data
            return View();
        }
        // Everything was ok, now save the record back to the database
        service.SaveModel(record);
        return View("Success");
    }
    

    在这方面它的行为类似于UpdateModel(),但如果成功则返回true,如果有错误则返回false。如果出现需要更多代码的错误,UpdateModel() 将引发异常。

    注意:您可能想要使用允许您 限制可以更新的属性。

    【讨论】:

      【解决方案3】:

      我们还使用TryUpdateModel 在调用Action 之前避免模型绑定魔法;相反,我们将HttpFormCollection 作为参数并在方法中调用TryUpdateModel。从此允许的控制流返回的干净布尔值传递给 Action 的 Success 或 Failure 方法。例如

      public ActionResult Save(HttpFormCollection formCollection)
      {
        var saveModel = new SaveModel(); // or from a Factory etc
        var validModel = TryUpdateModel(_saveModel, formCollection); // order may be incorrect
        return validModel ? Save(saveModel) : InvalidSaveModel(saveModel);
      }
      

      我们发现为所有验证案例构建HttpFormCollection 并因此测试操作非常容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 2013-06-13
        相关资源
        最近更新 更多