То, что вы пытаетесь сделать, выглядит хорошо, но это не сработает.Ограничений слишком много.
- Обычно только контроллер может решить, куда перенаправить в случае ошибки.Вы можете использовать дополнительные атрибуты, такие как [OnError ("Action")], но это выглядит как обходные пути.
- Форма не публикует все данные.Например, выпадающие списки, вспомогательные значения должны заполняться контроллером.Возможно, вы можете использовать фильтры действий для этого, но это снова выглядит как хак.
Вы можете настроить фильтр глобального действия (на базовом контроллере), который будет проверять ошибки модели (которые связывают наборы) иредирект (настройка. Результат).Но это запутанно и требует слишком много дополнительных «кодовых» атрибутов и т. Д., Которые затем сложно отследить и соотнести с реальной логикой приложения.И это скоро становится слишком ограничительным (см. Закон прокачки), когда вам нужно не просто имя действия при перенаправлении ошибки и т. Д.
Это выглядит намного проще, если сделать это так:1015 *
public ActionResult PostAction(ViewModel data)
{
if (!ModelState.IsValid)
return View("GetAction", data.WithDropDownList(repository.GetProducts()));
}
В приведенном выше примере контроллер имеет контроль над рабочим процессом, как и должно быть.Он также может свободно выполнять дополнительную проверку / настройку.Вы по-прежнему можете использовать как можно больше инфраструктуры - связующие модели для предоставления ошибок ModelState и т. Д. - но только контроллер должен принимать окончательное решение о входе и выходе.