2012-04-13 35 views
15

mam pogląd poniżej:sprawdzania poprawności ukrytych pól

@Html.LabelFor(m => m.CompanyPostCode) 
    @Html.TextBoxFor(m => m.CompanyPostCode) 

    @Html.LabelFor(m => m.CompanyCity) 
    @Html.TextBoxFor(m => m.CompanyCity) 

    @Html.HiddenFor(m => m.CompanyCityID) 

Wszystkie atrybuty są oznaczone jako [Wymagane] moim zdaniem modelu. Problem polega na tym, że mój identyfikator CompanyCityID (oznaczony jako Wymagany) jest ukryty, a zatem weryfikacja nie jest wykonywana w widoku. Jeśli pokażę ten atrybut w moim widoku, sprawdzanie poprawności jest wykonywane.

enter image description here

Moje pytanie: czy jest to możliwe do przeprowadzenia walidacji na ukrytym polu? Istnieje obejście?

Może się wydawać, że dziwne jest zatwierdzanie ukrytego pola. Powodem jest to, że to pole jest wypełniane z jQuery na podstawie specjalnych reguł. Jeśli nie jest wypełniony, wiem, że coś jest nieważne w widoku.

Dzięki.

Odpowiedz

27

Możliwą przyczyną może być to, że istnieje ignore: ':hidden' wiersz w pliku jquery.validate.unobtrusive.js.

Po wersji 1.9.0 jest to zachowanie domyślne. Można to naprawić ręcznie dodając

$.validator.setDefaults({ ignore: [] }); 

Jak widać here

Kolejna zmiana powinna dokonać konfiguracji form ukrytych elementów łatwiejsze, są one teraz domyślnie ignorowany (opcja „ignoruj "Ma teraz ": hidden "teraz domyślnie). Teoretycznie może to zepsuć istniejącą konfigurację . W mało prawdopodobnym przypadku, , możesz to naprawić, ustawiając opcję ignorowania na "[]" (nawiasy kwadratowe bez cudzysłowów ).

+0

Dziękuję bardzo. Dla mnie to teraz jasne. – Bronzato

+0

Naprawdę nienawidzę bycia tym facetem, który koryguje ludzi, ale ustawienie ignorowania nie jest ustawione przez jquery.validate.unobtrusive.js. Należy także pamiętać o działaniu setDefaults przed jego użyciem. Jeśli ustawisz wartości domyślne po podłączeniu sprawdzania poprawności formularza, oznacza to, że połączenie jest opóźnione. Zapraszam do zapoznania się z bardziej szczegółowym wyjaśnieniem. http://stackoverflow.com/questions/8466643/jquery-validate-enable-validation-for-hidden-fields/14574974#14574974 – JustinMichaels

+0

@JustinMichaels, może coś się zmieniło odkąd napisałem tę odpowiedź. W tym czasie sprawdziłem ustawienia jquery.validate.unobtrusive.js i zignorowałem. –

-1

Zawsze można umieścić @Html.HiddenFor(m => m.CompanyCityID) wewnątrz ukryty div i zmienić go na EditorFor().

CSS

.hidden { 
    display: none; 
}​ 

Zobacz

<div class="hidden"> 
     @Html.EditorFor(m => m.CompanyCityID) 
</div 
+2

To nie działa. Myślę, że wciąż może powiedzieć, że jest ukryty, nawet jeśli jest to rodzic, który jest ukryty. –

0

Można też po prostu skomentuj tę linię w pliku jquery.validate.js. ignore: ": hidden"

+0

duplikat odpowiedzi dla Chucka Norrisa –

0

Miałem ten problem. W moim przypadku musiałem zadzwonić do walidatora po wywołaniu ajax, a następnie dodać flagę "ignore". Zobacz przykład poniżej:

$.validator.unobtrusive.parse("#frm"); 
$.validator.setDefaults({ ignore: [] }); 

Zostały one wywołane w Document.Ready().

0

Jeśli nie musisz używać javascript w kontrolerze i w działaniu powiązanego widoku, możesz dodać błąd modelu przed sprawdzeniem poprawności modelu.Przykład:

[HttpPost] 
     public ActionResult Fix(YourModel mdl) 
    { 

    if (mdl.CompanyCityID==0) 
     ModelState.AddModelError("", "Your error message!"); 

    if (ModelState.IsValid) 
    { 


     // 
     //Some code 
     // 

     return View("YourView", yourlist); 
    } 

    return View(mdl); 
} 
Powiązane problemy