Пользовательская проверка модели на основе двух свойств. Одно влияет на другое
Я использую Asp.Net MVC 2 с каркасом сущностей 4. Вот ситуация: У меня есть флажок и текстовое поле (Выбор даты). Если флажок установлен, текстовое поле является обязательным. Если флажок ложен, текстовое поле не требуется.
Флажок True => Текстовое поле обязательно
Флажок False => Текстовое поле не требуется
<%:Html.CheckBoxFor(model => model.oEnvironment.Remediate) %>
<%= Html.TextBoxFor(model => model.oEnvironment.DatePick)%>
Я знаю, как создать ValidationAttribute, но я не знаю, как создать класс проверки, который проверяет, установлен ли флажок (если мой атрибут Entity Remediate Attribute имеет значение true), а затем при необходимости устанавливает поле Date Pick.
Любая идея?
5 ответов
Если вам не нужна проверка клиента, я предлагаю вам использовать ModeState.AddModelError
проверить свою логику (в вашем контроллере).
Что-то вроде:
[HttpPost]
public ActionResult Edit(MyModel model)
{
if (model.Remediate && string.IsNullOrEmpty(model.DatePick))
ModelState.AddModelError("DatePickRequired", "DatePick is required");
if (!ModelState.IsValid)
return View(model);
return View();
}
ГТЦ,
Stéphane.
Для комплексной проверки просто выполните проверку в действии (или в любом месте на стороне сервера).
В качестве совершенно другого подхода вы можете взглянуть на проект Fluent Validation http://fluentvalidation.codeplex.com/ который хорошо работает с MVC благодаря инверсии контейнера управления http://fluentvalidation.codeplex.com/wikipage?title=mvc&referringTitle=Documentation и http://www.jeremyskinner.co.uk/2010/02/22/using-fluentvalidation-with-an-ioc-container/
Это должно позволить вам действительно хорошо кодировать это и подобные правила, а в статьях IOC показано, как интегрироваться в MVC<3
(не совсем ответ, как вы заявили MVC2, но обновление до MVC3 также облегчит эту задачу, поскольку поддерживает проверку на уровне модели http://www.asp.net/mvc/mvc3)
Возможно, вы сможете реализовать интерфейс IDataErrorInfo в вашей модели, хотя я сам никогда не пробовал этого.