17

Ho la seguente vista in ASP.net MVC 3:ASP.net MVC convalida Hook

@model Models.CreateProjectViewModel 

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script> 
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script> 

@using(Html.BeginForm()) { 
    @Html.TextBoxFor(m => m.ProjectName) 
    @Html.ValidationMessageFor(m => m.ProjectName) 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
} 

Sto usando JavaScript discreto con jQuery e il quadro perfetto di convalida.

Quando faccio clic sul pulsante Salva e la convalida fallisce, c'è qualche evento in cui posso collegarmi per chiamare un javascript personalizzato?

function validationFailed() { 
    // do something here only if validation failed 
} 

Come dovrei legare nella convalida in modo che quando non è riuscito (e solo se non) ho potuto chiamare la mia funzione validationFailed().

+0

Che cosa stai cercando di fare esattamente? So che vuoi eseguire qualche javascript se fallisce, ma cosa stai cercando di ottenere facendo ciò? –

risposta

3

È possibile utilizzare il invalidHandler, credo che sia in validazione jQuery.

invalidHandler richiamata
richiamata per il codice personalizzato quando viene inviato un form non valido. Chiamato con un oggetto evento come primo argomento e il validatore come secondo .

+0

Se utilizzo le annotazioni di dati o la convalida fluida, ciò interferirà con la creazione di un gestore di convalida nella mia visualizzazione? – Dismissile

+0

Questa sarà solo una richiamata che viene attivata quando il modulo inviato non è valido. Tutte le convalide create tramite annotazioni di dati, ecc. Funzioneranno normalmente. –

+0

Questo non funziona. Quando aggiungo validate() al mio modulo, viene semplicemente ignorato. Penso che ci sia un conflitto tra il mio gestore di validazione che le annotazioni di dati stanno creando e quello che sto cercando di aggiungere manualmente. – Dismissile

35

Come jQuery/Valutazione docs dice, si potrebbe usare invalidHandler reagire quando viene inviato un form non valido.

Ma dal momento che MVC non invadente convalida la convalida stessa, è necessario collegare questo evento in un secondo momento.

Utilizzando esattamente lo stesso meccanismo come fa il jQuery/Valutazione: si potrebbe vincolare il proprio codice per gli elementi del modulo evento personalizzato 'invalid-form.validate', strega corrisponde al invalidHandler!

$(document).ready(function() { 
    $('#myform').bind('invalid-form.validate',function(){ 
     alert('invalid form!'); 
    }); 
}); 

che invia il modulo un uso id:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myform" })) { 
} 

Aggiornamento:

Un modo alternativo per ottenere l'oggetto di convalida esistente sta chiamando validate() sul modulo. Se un validatore per questa forma è già stato creato, verrà restituito:

Edit: dopo l'inizializzazione si è verificato, cambiando .settings.invalidHandler è troppo tardi per la rilegatura. Quindi il seguente snippet non funzionerà più [a] a meno che non si riesegua il validatore.

$(document).ready(function() { 
    var existingValdiation = $("#myform").validate(); 
    //the settings property corresponds to the options parameter 
    existingValdiation.settings.invalidHandler = function (form) { 
     alert('invalid form!'); 
    }; 
    // not recommended: 
    // re-init would bind settings.invalidHandler to 'invalid-form.validate' 
    // existingValdiation.init(); 
}); 
+0

La prima opzione ha funzionato benissimo :) :) –

+0

Grazie. La prima opzione era perfetta per me. = -) –

+0

La prima opzione ha funzionato. Il secondo no. Dovresti modificare un'alternativa o eliminarla? Grazie per il primo. –