Проверка клиентской стороны mvc для вложенных (коллекционных) свойств - PullRequest
6 голосов
/ 01 апреля 2011

Я использую asp.net mvc 3 с ненавязчивой проверкой jquery.Недавно я перешел со стандартных DataAnnotations на FluentValidation, и он прекрасно работает.

Моей основной причиной выбора FluentValidation была необходимость проверки вложенных свойств моей модели представления (но я обнаружил, что есть и другие интересные причины для ее использования), чтовроде как (не обращайте внимания на аксессоры, это псевдо):

class Vm {
  string Prop;
  string AnotherProp;
  IEnumerable<ElementsVm> Elements;
}

class ElementsVm {
  bool Required;
  string Id;
  string Title;
  string Value;
}

Используя FluentValidation, я делаю валидатор для Vm и ElementVm, и мои модульные тесты зеленые, показывая, что проверка на стороне сервера работает.

Клиентская сторона, «Prop» и «AnotherProp» работает - мои правила проверки также работают на клиентской стороне, как и ожидалось (как это было бы с DataAnnontation), но все мои элементы не получают никакой проверки на стороне клиентавообще - я проверяю dom и вижу, что все атрибуты data-val, data-required и т. д. отсутствуют.

Я пробовал разные подходы к генерации html в моих представлениях, но «Prop»и «AnotherProp» генерируются с использованием Html.TextBoxFor (m => m.Prop), в то время как мои элементыОн порожден частично - вот с чего начинаются проблемы.Если я выберу Html.TextBoxFor (m => m.Value), все мои текстовые поля элемента будут иметь одинаковое имя / идентификатор, поэтому я также попытался использовать Html.TextBox (Model.Id) для генерации уникального идентификатора / имени, но все еще без свойств проверки..

Итак, есть ли способ заставить мой senario работать - я не против немного переписать его, но я бы очень хотел, чтобы FluentValidation написал мой html для меня.

Мое аварийное решениебыло бы сделать мои собственные помощники HTML для создания правильного HTML с атрибутами, но я думаю, что это будет отстой, так как мне пришлось бы постоянно обновлять эти помощники, когда новые выпуски / исправления были сделаны либо для FluentValidation, проверки JQuery или ссылки в mvcмежду двумя.

1 Ответ

8 голосов
/ 13 апреля 2011

В вашей части, перед каждым экземпляром ElementsVM, вы должны установить уникальный префикс, используя ViewData.TemplateInfo.HtmlFieldPrefix, например:

var i = 0; 
foreach (var element in Model) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Elements[" + i.ToString() + "]"; 
    @Html.TextBoxFor(m => m.Value) 
    i++; 
}

Это должно дать вам ваши ненавязчивые атрибуты проверки, а такжеработа со связывателем модели по умолчанию.

counsellorben

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...