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

时间:2011-03-11 02:45:05

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

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

3 个答案:

答案 0 :(得分:47)

您可以使用此方法更新通过给定控制器支持特定视图的模型。例如,如果我有一个显示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的安全警告:

  

安全提示使用其中一个   [过载: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 :(得分: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");
}

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

  

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

答案 2 :(得分:12)

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

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非常容易,因此测试操作。