2012-03-14 25 views
16

Używam MVC3 z dyskretnym sprawdzaniem poprawności. Mam pole, w którym użytkownik ma wypełnić pewne dane, a następnie naciśnij przycisk "szukaj". Jeśli wyszukiwanie nigdy nie zostało naciśnięte lub użytkownik zmienił pole wprowadzania po naciśnięciu przycisku wyszukiwania, formularz nie powinien być możliwy do przesłania.Sprawdzanie poprawności ukrytego pola

Dodałem ukryte pole ustawione na true przez zdarzenie click() przycisku i opróżnione przez zdarzenie keyup() w polu wprowadzania. Teraz chciałbym dodać regułę sprawdzania poprawności, która wymaga, aby ukryte pole było true, aby umożliwić przesyłanie.

Najlepiej chciałbym użyć dyskretnego sprawdzania poprawności, ale jeśli to nie działa, to jest ok z czymś, co wymaga trochę javascriptu, o ile nie zepsuje dyskretnego sprawdzania poprawności dla reszty formularza.

Poniższy fragment kodu działa dokładnie tak, jak chcę, dopóki nie dodaję type="hidden".

<input class="required" id="client-searched" data-val="true" 
    name="ClientSearched" data-val-required="Press search!"/> 
<span class="field-validation-valid" data-valmsg-replace="true" 
    data-valmsg-for="ClientSearched"/> 

Odpowiedz

26

spróbować

var validator = $("#myFormId").data('validator');  
    validator.settings.ignore = ""; 

Oto informacyjny blog post

EDIT

@RAM zaproponował lepsze rozwiązanie proszę FOLLOW

+2

To wygląda podobne rzeczy zmieniły się od tego posta na blogu. W poście wyjaśniają, jak * wyłączyć * sprawdzanie poprawności ukrytych pól. W jquery.validate 1.9.0 domyślną wartością jest 'ignore:": hidden "'. –

+0

Zignoruje ignorowanie w ogóle, nie uważam tego za poprawne rozwiązanie – tutok

+0

@tutok jego roczna odpowiedź plz edytuj pytanie, aby dodać swój cenny wkład ... pozdrowienia – Rafay

20

miałem podobny problem, a ja ten kod zmienia wartości domyślne, w MVC 4:

@Scripts.Render("~/bundles/jqueryval") 

<script type="text/javascript"> 
    $.validator.setDefaults({ 
     ignore: "" 
    }) 
</script> 

Źródło: JQuery validate

2

W niektórych przypadkach chcesz prostu zignorować walidacji na jednym lub kilku ukrytych pól (nie wszystkie pola ukrytego) w client side a także chcą zweryfikować je i inne ukryte pola w server side. W tych przypadkach masz atrybuty sprawdzania poprawności dla wszystkich ukrytych pól w twoim ViewModel i będą one używane do sprawdzania poprawności formularza po jego opublikowaniu (server side).

Potrzebna jest teraz sztuczka do sprawdzenia poprawności niektórych ukrytych pól po stronie klienta (nie wszystkie z nich). W takich przypadkach zalecam korzystanie z mojego mechanizmu!

Ustaw data-force-val jako true w docelowych ukrytych znacznikach wejściowych. Jest to nasz niestandardowy atrybut, którego używamy do wykrywania ukrytych danych wejściowych, które chcemy zweryfikować po stronie klienta.

// This hidden input will validate both server side & client side 
<input type="hidden" value="" name="Id" id="Id" 
     data-val-required="The Id field is required." 
     data-val="true" 
     data-force-val="true"> 

// This hidden input will validate both server side & client side 
<input type="hidden" value="" name="Email" id="Email" 
     data-val-required="The Email field is required." 
     data-val="true" 
     data-force-val="true"> 

// This hidden input just will validate server side 
<input type="hidden" value="" name="Name" id="Name" 
     data-val-required="The Neme field is required." 
     data-val="true"> 

Ponadto można ustawić data_force-val dla swoich ukrytych wejść przez jQuery:

$("#Id").attr("data-force-val", true); // We want validate Id in client side 
$("#Email").attr("data-force-val", true); // We want validate Email in client side 
$("#Name").attr("data-force-val", false); // We wont validate Name in client side (This line is not necessary, event we can remove it) 

Teraz aktywną data-force-val="true" funkcjonalność przez niektórych prostych kodów takie jak:

var validator = $("#TheFormId").data('validator');  
validator.settings.ignore = ":hidden:not([data-force-val='true'])"; 

Uwaga: wartości validator.settings.ignore domyślny to :hidden

Powiązane problemy