2011-04-01 6 views
6

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

Моя основная причина для выбора 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 и вижу, что все данные, данные, необходимые данные и т. д. отсутствуют.

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

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

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

ответ

8

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

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

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

advsellorben

+0

Спасибо! Это работает и должно быть отмечено как ответ. – JustinP8

+1

Кроме того, не забудьте перезагрузить 'ViewData.TemplateInfo.HtmlFieldPrefix =" "', если у вас есть входы после цикла. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: У меня такая же проблема, но это не исправить. Я использую EditorTemplates для моей вложенной коллекции, и все атрибуты 'id' тега 'input' уже имеют префикс соответствующих/эквивалентных «Elements [0]». «ViewData.TemplateInfo.HtmlFieldPrefix» удобен для понимания, но не для меня. @Per отметил, что отсутствуют атрибуты «data-val, data-required и т. Д.». Я заметил то же самое. – tkerwood

Смежные вопросы