簡體   English   中英

何時以及為何在asp.net mvc 2中使用TryUpdateModel?

[英]When and why do you use TryUpdateModel in asp.net mvc 2?

我似乎無法找到一個基本的代碼示例,看看TryUpdateModel是如何工作的? 你什么時候使用它,為什么?

您可以使用此方法更新通過給定控制器支持特定視圖的模型。 例如,如果我有一個顯示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()會拋出異常。

注意:您可能希望使用其中一個重載,以允許您限制可以更新的屬性。

在調用Action之前,我們還使用了TryUpdateModel來避免模型綁定魔法; 相反,我們將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);
}

我們發現為所有驗證案例構建HttpFormCollection非常容易,因此測試操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM