2011-10-17 17 views
9

Mam ukryte pole z walidacji dla niego jak poniżejwalidacja po stronie klienta nie działa na polu ukryte w ASP.NET MVC 3

@Html.HiddenFor(m => m.Rating) 
@Html.ValidationMessageFor(m => m.Rating) 

Obiekt Rating został Range atrybut walidator stosowane z zakresu bycia 1- 5. Zostanie on umieszczony w formularzu za pomocą przycisku przesyłania.

I wtedy dostał po jQuery, który ustawia wartość w ukrytym polu na jakimś zdarzenia użytkownika (zasadniczo użytkownik kliknie na niektórych gwiazd oceniać)

$(".star").click(function(){ 
    $("#Rating").val(2); 
}); 

gdybym wysłać formularz bez przypadku użytkownika, który wyznacza ukryte pole, sprawdzanie poprawności działa. Komunikaty o błędach są wyświetlane poprawnie i działają po stronie klienta.

Teraz, w tej sytuacji, jeśli kliknę w gwiazdki, które wywoła powyższy skrypt javascript a ustawi ukryte pole, komunikat o błędzie sprawdzania poprawności nie zniknie. Mogę przesłać formularz po tym, jak ukryta zmienna ma jakąś prawidłową wartość. Ale oczekuję, że sprawdzanie poprawności strony klienta powinno działać. (Gdy zmienna ukryta zostanie ustawiona z pewną poprawną wartością, błąd sprawdzania poprawności powinien zniknąć)

Początkowo myślałem, że walidacja jquery zostanie wywołana w niektórych specjalnych wydarzeniach, więc spróbowałem podnieść kliknięcie, zmianę, kluczowanie, rozmycie i same wydarzenia skupiające się poniżej:

$(".star").click(function(){ 
    $("#Rating").val(2); 
    $("#Rating").change(); 
}); 

Ale to nadal nie działa. Komunikaty o błędach pojawiły się raz, w ogóle nie znikają.

Odpowiedz

2

W kodzie, który ustawia wartość tego pola ukrytego za, ręcznie wywołać walidacji formularza, tak:

$("form").validate().form(); 
+0

Nie sądzę, że potrzebujesz wywołania formularza() na końcu powyższe stwierdzenie. –

+0

'form()' jest konieczne, aby zaktualizować komunikaty o błędach w formularzu. Ponieważ pytanie dotyczyło natychmiastowej aktualizacji komunikatów o błędach, jest to konieczne. – counsellorben

+0

@counsellorben To działało jak wdzięk – Suhas

1

Myślę, że tak jest, ponieważ ukryte dane wejściowe nie wywołują żadnego z tych zdarzeń.

Zamiast używać ukrytego pola, można zamiast tego użyć <input type="text" style="display:none" />;

@html.TextBoxFor(m => m.Rating, new {display = "display:none"}) 
+0

To też nie działa. Domyślam się, że po ustawieniu ukrytej zmiennej, muszę podnieść pewne zdarzenie javascript, takie jak zmiana/rozmycie, które ponownie sprawdza poprawność przeciwpożarową. Nie jestem pewien, które to zdarzenie jest jednak – Suhas

+0

Tak, dla ukrytego pola tekstowego, wystrzeliłbyś zdarzenie .change(). Myślę, że dla ukrytych danych wejściowych nie ma domyślnego, zmienionego zdarzenia, do którego można się przyczepić. –

+0

Niestety to nie działa. Wywołuję zdarzenie zmiany jawnie po ustawieniu wartości ukrytego pola tekstowego. Ale błąd sprawdzania poprawności nie zniknie – Suhas

5

Można owinąć ukryte pole z div umieścić gdzieś, ale nadal wewnątrz <form> . Dodaj css, aby kopać go w przestrzeń kosmiczną.

<div style="position:absolute; top:-9999px; left:-9999px"> 
<input id="Rating" type="hidden" name="rating" > 
</div> 

Następnie dodać następujące etykiety, gdzie chcesz, aby pokazać błąd:

<label for="rating" class="error" style="display:none">I am an an error message, please modify me.</label> 
+0

Nie pracuję nad tym projektem, więc nie mogę tego wypróbować. ale podobała mi się ta sugestia, więc kciuki w górę :) – Suhas

+0

Świetny pomysł, uratowałem mój bekon dzisiaj ... –

+0

To "jest" rozwiązaniem. Dzięki. – Remotec

5

walidacja po stronie klienta ignoruje ukryte pola. Możesz ustawić opcję "ignore" dynamicznie, ale aby ją uruchomić, zrobiłem bezpośrednio w pliku .js.

Na razie powinno to załatwić sprawę.

W moim aspx ...

<%: Html.HiddenFor(model => model.age, new { @class="formValidator" }) %> 

W jquery.validate.js

ignore: ":hidden:not('.formValidator')", 
5

ta okazała się bardzo interesująca kwestia. domyślne ustawienie "ignore" ignoruje ukryte pola. Pole zostało ukryte w wtyczce jQuery ui.Po prostu dodałem klasę o nazwie "includeCheckBox" do renderowanego wejścia, które chciałem zweryfikować i wstawić następujący wiersz kodu w ...

var validator = $('#formMyPita').validate(); 
validator.settings.ignore = ':hidden:not(".includeCheckBox")'; 
if ($('#formMyPita').valid()) {.... 
Powiązane problemy