0

Когда и зачем использовать TryUpdateModel в ASP.NET MVC 2?

73

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

2 ответ(ов)

0

TryUpdateModel() позволяет вам связывать параметры с вашей моделью внутри действия контроллера. Это полезно, если вы хотите загрузить вашу модель из базы данных и затем обновить её на основе пользовательского ввода, вместо того чтобы получать всю модель только из пользовательского ввода.

public ActionResult Update(int id) {
    var service = new ServiceClass();
    var record = service.LoadModel(id);
    if (!TryUpdateModel(record)) {
        // Произошла ошибка при связывании данных
        return View();
    }
    // Всё прошло успешно, теперь сохраним запись обратно в базу данных
    service.SaveModel(record);
    return View("Success");
}

TryUpdateModel() действует аналогично UpdateModel() в этом отношении, но возвращает true при успешном выполнении и false, если произошла ошибка. В отличие от UpdateModel(), который выбрасывает исключение в случае ошибки и требует немного больше кода для обработки.

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

0

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

public ActionResult Save(HttpFormCollection formCollection)
{
    var saveModel = new SaveModel(); // или из Фабрики и т.д.
    var validModel = TryUpdateModel(saveModel, formCollection); // порядок может быть неверным
    return validModel ? Save(saveModel) : InvalidSaveModel(saveModel);
}

Мы заметили, что создать HttpFormCollection для всех случаев валидации достаточно просто, и поэтому мы смогли эффективно протестировать действие.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь