пользовательские связыватель моделей - PullRequest
1 голос
/ 26 июня 2010

Я хочу создать пользовательский связыватель моделей, который проверяет ограниченную модель.Я нашел несколько примеров этого, и он работает как следует.Но я также хочу иметь возможность отправить пользователя обратно на страницу, с которой он пришел, если в модели есть ошибки.

Возможно ли это сделать и есть ли очевидные побочные эффекты при этом?1003 *

Чего я хочу добиться, так это того, чтобы контроллер всегда получал действительные команды, поэтому мне не нужно проверять model.IsValid () в методе действия.

1 Ответ

3 голосов
/ 26 июня 2010

То, что вы пытаетесь сделать, выглядит хорошо, но это не сработает.Ограничений слишком много.

  1. Обычно только контроллер может решить, куда перенаправить в случае ошибки.Вы можете использовать дополнительные атрибуты, такие как [OnError ("Action")], но это выглядит как обходные пути.
  2. Форма не публикует все данные.Например, выпадающие списки, вспомогательные значения должны заполняться контроллером.Возможно, вы можете использовать фильтры действий для этого, но это снова выглядит как хак.

Вы можете настроить фильтр глобального действия (на базовом контроллере), который будет проверять ошибки модели (которые связывают наборы) иредирект (настройка. Результат).Но это запутанно и требует слишком много дополнительных «кодовых» атрибутов и т. Д., Которые затем сложно отследить и соотнести с реальной логикой приложения.И это скоро становится слишком ограничительным (см. Закон прокачки), когда вам нужно не просто имя действия при перенаправлении ошибки и т. Д.

Это выглядит намного проще, если сделать это так:1015 *

public ActionResult PostAction(ViewModel data)
{
   if (!ModelState.IsValid)
      return View("GetAction", data.WithDropDownList(repository.GetProducts()));

}

В приведенном выше примере контроллер имеет контроль над рабочим процессом, как и должно быть.Он также может свободно выполнять дополнительную проверку / настройку.Вы по-прежнему можете использовать как можно больше инфраструктуры - связующие модели для предоставления ошибок ModelState и т. Д. - но только контроллер должен принимать окончательное решение о входе и выходе.

...