什么时候以及为什么在asp.net mvc 2中使用TryUpdateModel?

我似乎无法find一个基本的代码示例,看看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的给定值更新模型。 如果更新validation失败(例如,Bar是一个整数,文本框中有文本“hello”),则TryUpdateModel将传递更新ViewData ModelState的validation错误,您的视图将显示validation错误。

请确保在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()允许你在你的动作中绑定参数到你的模型。 如果要从数据库加载模型,然后根据用户input进行更新,而不是从用户input中取出整个模型,这非常有用。

 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()将引发exception。

注意:您可能想要使用一个重载,允许您限制哪些属性可以更新。

在Action被调用之前,我们还使用了TryUpdateModel来避免模型绑定的魔法; 相反,我们把一个HttpFormCollection作为参数,并在方法内调用TryUpdateModel 。 从此允许的控制stream返回的干净的布尔值被传递给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); } 

我们发现为我们所有的validation案例构build一个HttpFormCollection非常简单,因此可以testing这个操作。