何时以及为什么在ASP.NETMVC 2中使用TryUpdateModel?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

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

提问于
用户回答回答于

可以使用此方法通过给定的控制器更新支持特定视图的模型。例如,如果我有一个视图显示带有由文本框填充的属性Bar的Foo对象,则可以在控制器上调用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的安全警告:

安全说明使用[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

用户回答回答于

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()如果出现需要更多代码的错误,则引发异常。

注意:可能希望使用允许您限制可以更新哪些属性的重载之一。

扫码关注云+社区