2011-10-17 13 views
9

Ho un campo nascosto con una convalida per come qui sottoclient validazione lato non funziona per il campo nascosto in asp.net MVC 3

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

La proprietà Rating ha Range attributo validatore applicato con gamma essendo 1- 5. Questo è inserito in un modulo con un pulsante di invio.

mi hanno poi avuto seguito jquery che imposta il valore nel campo nascosto in qualche evento utente (in pratica l'utente fa clic su alcune stelle a votarla)

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

Ora, se io inviare il modulo senza l'evento utente che imposta il campo nascosto, la validazione funziona. I messaggi di errore sono visualizzati correttamente e funzionano su tutti i client.

Ora, in questa situazione, se faccio clic su stelle, che invoca il javascript sopra a imposta il campo nascosto, il messaggio di errore di convalida non scomparirà. Posso inviare il modulo dopo che la variabile nascosta ha un valore valido. Ma mi aspetto che la convalida del lato client dovrebbe funzionare. (Quando la variabile nascosta è stata impostata con un valore valido, l'errore di convalida dovrebbe andare via)

Inizialmente pensavo, la convalida jquery sarebbe stata invocata su alcuni eventi speciali, quindi ho provato a fare clic su, cambiare, keyup, sfocatura e eventi di messa a fuoco me stesso come sotto

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

Ma questo non funziona ancora. I messaggi di errore, una volta visualizzati, non spariscono affatto.

risposta

2

Nel codice che imposta il valore del campo nascosto, richiamare manualmente convalida per la forma, in questo modo:

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

Non penso che tu abbia bisogno della chiamata a form() alla fine di la dichiarazione di cui sopra. –

+0

'form()' è necessario per aggiornare i messaggi di errore sul modulo. Poiché la domanda riguardava un aggiornamento immediato dei messaggi di errore, è necessario. – counsellorben

+0

@counsellorben Che ha funzionato come un fascino – Suhas

1

Penso che sia perché gli input nascosti non attivano nessuno di questi eventi.

Quello che si potrebbe fare invece sarebbe utilizzare un <input type="text" style="display:none" /> invece del campo nascosto;

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

Anche questo non funziona. La mia ipotesi migliore è che dopo aver impostato la variabile nascosta, ho bisogno di aumentare alcuni eventi javascript come il cambiamento/sfocatura che convalida nuovamente il fuoco. Non sono sicuro di quale evento sia se – Suhas

+0

Sì, per la casella di testo nascosta, si attiva l'evento .change(). Penso che per l'input nascosto, non ci sia alcun evento cambiato di default a cui collegarsi. –

+0

Sfortunatamente non funziona. Sparo esplicitamente l'evento change dopo aver impostato il valore della casella di testo nascosta. Ma l'errore di validazione non va via – Suhas

5

si può avvolgere il vostro campo nascosto con un div mettere da qualche parte, ma ancora all'interno della <form> . Aggiungi css per calciarlo nello spazio.

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

quindi aggiungere il seguente etichetta al punto in cui si desidera visualizzare l'errore:

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

Non sto lavorando di più su questo progetto, quindi non ho modo di provarlo. ma mi è piaciuto il suggerimento, quindi complimenti :) – Suhas

+0

Ottima idea, salvata la mia pancetta oggi ... –

+0

Questa "è" la soluzione. Grazie. – Remotec

5

validazione lato client ignora campi nascosti. È possibile impostare dinamicamente l'opzione "ignora" ma, per farlo funzionare, ho fatto direttamente quanto segue nel file .js.

Per ora questo dovrebbe fare il trucco.

Nel mio aspx ...

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

In jquery.validate.js

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

Questa si è rivelata una questione molto interessante. l'impostazione predefinita "ignora" ignora i campi nascosti. Il campo era nascosto in un plug-in ui jQuery.Ho semplicemente aggiunto una classe chiamata "includeCheckBox" all'input reso che volevo validare e inserire la seguente riga di codice in ...

var validator = $('#formMyPita').validate(); 
validator.settings.ignore = ':hidden:not(".includeCheckBox")'; 
if ($('#formMyPita').valid()) {.... 
Problemi correlati