Вопрос

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

Это возможно делать и есть какие-то очевидные побочные эффекты, делая это?

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

Это было полезно?

Решение

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

  1. Обычно только контроллер может решить, где перенаправить в случае ошибки. Вы можете использовать дополнительные атрибуты, такие как [ONERROR («ДЕЙСТВИЕ»)], но это выглядит как обходные пути.
  2. Форма не пост все данные. Например, раскрывающиеся списки, вспомогательные значения должны быть заполнены контроллером. Возможно, вы можете использовать действительные фильтры для этого, но это снова выглядит как взлом.

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

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

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

}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top