何时以及为何在asp.net mvc 2中使用TryUpdateModel?

use*_*007 54 c# asp.net asp.net-mvc

我似乎无法找到一个基本的代码示例,看看TryUpdateModel是如何工作的?你什么时候使用它,为什么?

Mar*_*oms 48

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

public class Foo {
  public string Bar { get; set; }
}

// ... in the controller
public ActionResult Save() {
  var myFoo = new Foo();
  TryUpdateModel(myFoo);
}
Run Code Online (Sandbox Code Playgroud)

这将尝试使用Bar的给定值更新模型.如果更新未通过验证(例如,Bar是一个整数且文本框中包含文本"hello"),则TryUpdateModel将通过更新ViewData ModelState并显示验证错误,您的视图将显示验证错误.

确保在MSDN文档中密切关注.NET Framework 4的安全警告:

安全说明使用[Overload:System.Web.Mvc.Controller.TryUpdateModel``1]方法之一,该方法包含要包括的属性列表(白名单)或要排除的属性列表(黑名单).如果未传递明确的白名单或黑名单,则[Overload: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被强制执行(http://www.extremetech.com/computing/120981-github-hacked-millions-of-projects-at-risk-of-being-改性或缺失). (12认同)

小智 17

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");
}
Run Code Online (Sandbox Code Playgroud)

UpdateModel()在这方面的行为类似,但在成功时返回true,如果有错误则返回false.UpdateModel()如果存在需要更多代码的错误,则抛出异常.

注意:您可能希望使用其中一个重载,以允许您限制可以更新的属性.


Cia*_*ran 13

我们还习惯TryUpdateModel在调用Action之前避免模型绑定魔法; 相反,我们将a HttpFormCollection作为参数并TryUpdateModel在方法中调用.从此允许的控制流返回的clean boolean值将传递给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);
}
Run Code Online (Sandbox Code Playgroud)

我们发现HttpFormCollection为所有验证案例构建一个很容易,因此测试操作.