2011-04-01 12 views
6

Używam asp.net mvc 3 z niewymuszonym sprawdzaniem jquery. Niedawno zmieniłem standardową funkcję DataAnnotations na FluentValidation i działa doskonale.Sprawdzanie poprawności klienta mvc dla właściwości zagnieżdżonych (kolekcja)

Głównym powodem pobrania FluentValidation była potrzeba sprawdzenia poprawności zagnieżdżonych właściwości w moim viewmodelu (ale odkryłem, że istnieją inne fajne powody, dla których go używam), który wygląda tak (nie myśl, że to jest pseudo):

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

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

Korzystanie FluentValidation zrobię walidator dla Vm i ElementVm i moje testy jednostkowe są zielone, pokazując mi walidacji po stronie serwera pracuje.

Działa po stronie klienta, "Prop" i "AnotherProp" - moje reguły sprawdzania poprawności działają również zgodnie z oczekiwaniami klienta (tak jak w przypadku DataAnnontation), ale wszystkie moje elementy nie uzyskują żadnej walidacji po stronie klienta. - Sprawdzam dom i widzę, że brakuje wszystkich atrybutów data-val, danych-wymaganych itp.

Próbowałem różnych metod generowania html w moich widoków, ale "Prop" i "AnotherProp" są generowane przy użyciu Html.TextBoxFor (m => m.Prop), podczas gdy moje elementy są generowane w częściowe - tutaj zaczynają się problemy. Jeśli wybiorę Html.TextBoxFor (m => m.Value) wszystkie moje pola tekstowe elementów będą miały taką samą nazwę/identyfikator, więc próbowałem również użyć Html.TextBox (Model.Id), aby wygenerować unikalny identyfikator/nazwę, ale nadal nie ma właściwości sprawdzania poprawności .

Czy istnieje sposób, aby mój senario działał - nie mam nic przeciwko przepisywaniu go nieco, ale naprawdę chciałbym FluentValidation napisać dla mnie mój html.

Moim rozwiązaniem awaryjnym byłoby utworzenie własnych helperów HTML, które generowałyby poprawny HTML z atrybutami, ale to byłoby do bani, ponieważ musiałbym aktualizować tych pomocników, gdy nowe wydania/poprawki zostały wprowadzone do FluentValidation, sprawdzanie poprawności jquery lub link w mvc między tymi dwoma.

Odpowiedz

8

w twojej częściowe, przed każdym wystąpieniem ElementsVM należy ustawić unikalny prefiks przy użyciu ViewData.TemplateInfo.HtmlFieldPrefix, tak:

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

To powinno dać atrybuty dyskretne walidacji, a także powinny działać z domyślnym segregatorem modelu.

counsellorben

+0

Dzięki! To działa i powinno być oznaczone jako odpowiedź. – JustinP8

+1

Nie zapomnij również zresetować 'ViewData.TemplateInfo.HtmlFieldPrefix =" "' jeśli masz wejścia po pętli. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: Mam ten sam problem, ale to nie naprawiło. Używam programu EditorTemplates dla mojej kolekcji zagnieżdżonej i wszystkie atrybuty "id" tagu wejściowego są już poprzedzone odpowiednimi/odpowiednimi "Elementami [0]". "ViewData.TemplateInfo.HtmlFieldPrefix" jest przydatna, ale nie stanowi problemu dla mnie. @Per wspomniał, że brakuje "atrybutów danych, danych, itp.". Zauważyłem to samo. – tkerwood

Powiązane problemy