Когда и почему вы используете TryUpdateModel в asp.net mvc 2? - PullRequest
54 голосов
/ 11 марта 2011

Не получается найти простой пример кода, чтобы увидеть, как работает TryUpdateModel?Когда вы его используете и почему?

Ответы [ 3 ]

47 голосов
/ 11 марта 2011

Вы можете использовать этот метод для обновления модели, поддерживающей конкретный вид через данный контроллер.Например, если у меня есть представление, отображающее объект Foo со свойством Bar, заполненным текстовым полем, я могу вызвать метод 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 с ошибками проверки, и ваше представление отобразит ошибки проверки.

Убедитесь, что вы внимательно следите за предупреждением безопасности для .NET Framework 4 в документации MSDN:

Примечание по безопасности Используйте одно из [Перегрузка: Система.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

17 голосов
/ 11 марта 2011

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() выдает исключение, если возникает ошибка, требующая немного больше кода.

Примечание. Возможно, вы захотите использовать одну из перегрузок, которая позволяет ограничить, какие свойства могут быть обновлены.

12 голосов
/ 11 марта 2011

Мы также использовали TryUpdateModel, чтобы избежать магии привязки модели до вызова действия; вместо этого мы взяли HttpFormCollection в качестве нашего параметра и вызвали TryUpdateModel в методе. Чистое логическое значение, возвращаемое из этого разрешенного потока управления, будет передано методу Success или Failure для Action. например,

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 для всех наших случаев проверки и, следовательно, протестировать действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...