Когда и почему вы используете TryUpdateModel в asp.net mvc 2?


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

3 52

3 ответа:

вы можете использовать этот метод для обновления модели, которая поддерживает определенный вид через данный контроллер. Например, если у меня есть представление, отображающее объект Foo со строкой свойств, заполненной текстовым полем, я могу вызвать метод Save() на контроллере и вызвать TryUpdateModel, чтобы попытаться обновить Foo.

public class Foo {
  public string Bar { get; set; }
}

// ... in the controller
public ActionResult Save() {
  var myFoo = new Foo();
  TryUpdateModel(myFoo);
}

это будет пытаться обновить модель с заданным значением для бара. Если обновление не проходит проверку (скажем, например, что бар был целым числом и текстовое поле имело текст "привет" в нем) затем TryUpdateModel передаст обновление ViewData ModelState с ошибками проверки, и ваше представление отобразит ошибки проверки.

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

Безопасность используйте один из [Перегрузка: Система.Сеть.Mvc.Контроллер.TryUpdateModel " 1] методы, которые принимают либо список свойства для включения (белый список) или список свойства для исключения (a черный список.) Если нет явного белого списка или черный список передается, [Перегрузка: Система.Сеть.Mvc.Контроллер.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() выдает исключение, если есть ошибка, которая требует немного больше кода.

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

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

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