2013-01-03 18 views
16

Non riesco a vedere la convalida lato client con la seguente vista parziale. Questa vista è all'interno div divettings div nella vista genitore. Ho provato un sacco di cose da StackOverflow e altri siti, niente sembra funzionare. Qualche idea?validazione lato client jQuery non funzionante in vista parziale MVC3

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


@using (Ajax.BeginForm("CreateT", "TAdmin", null, 
     new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "divTSettings"}, 
         new { id = "CreateTForm" })) 
{ 
    <div> 
     <label>Name:</label> 
     <input type="text" name="tName" id="tName"/> 
     @Html.ValidationMessage("tName") 
     <input type="submit" value="Submit"/> 
    </div> 
} 

<script type="text/javascript"> 
$(function() { 
    $('#CreateTForm').validate({ 
     rules: { 
      tName: { 
       required: true 
      } 
     }, 
     messages: { 
      tName: { 
       required: 'Name required' 
      } 
     } 
    }); 
    $("#CreateTForm").removeData("validator"); 
    $("#CreateTForm").removeData("unobtrusiveValidation"); 
    $.validator.unobtrusive.parse("#CreateTForm"); 
}); 
</script> 

risposta

77

Tutte le idee?

Sì, la prima cosa da fare è eliminare tutti i tag <script> dalla vista parziale. Le viste parziali non dovrebbero contenere alcuno script. Le viste parziali dovrebbero contenere solo il markup. L'ho ripetuto molte volte e vedo ancora persone che mettono script in-là. Gli script devono essere registrati nel proprio layout o nella vista principale in cui è stato eseguito il rendering parziale, probabilmente sovrascrivendo la sezione di alcuni script registrata nel proprio layout in modo che tutti gli script vengano inseriti alla fine del documento HTML, appena prima del tag di chiusura </body> . Ecco dove appartengono.

OK, ora il problema reale: la convalida non invadente non funziona immediatamente con gli elementi aggiunti dinamicamente al DOM, come ad esempio l'invio di una richiesta AJAX al server che restituisce una vista parziale e questa vista parziale viene quindi iniettata nel DOM.

Per funzionare, è necessario registrare gli elementi appena aggiunti con il framework di convalida non invadente. Per fare questo è necessario chiamare il $.validator.unobtrusive.parse sugli elementi appena aggiunti:

$("form").removeData("validator"); 
$("form").removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("form"); 

Si dovrebbe mettere questo codice all'interno del gestore successo AJAX che sta iniettando il parziale nel vostro DOM. Una volta che hai iniettato i nuovi elementi, chiama semplicemente questa funzione.

E se non si scrivono le richieste AJAX manualmente con jQuery ($ .ajax, $ .post, ...) ma si affidano ad alcuni Ajax.BeginForm e Ajax.ActionLink gli helper fanno il lavoro per te, lo farai è necessario abbonarsi alla callback di OnSuccess in AjaxOptions e inserire questo codice.

+0

Grazie per la risposta, ma la vista parziale non viene caricato da AJAX, viene caricato dal genitore utilizzando il modello del genitore. Rende post AJAX ma la convalida non funziona nemmeno per il primo carico. E come puoi vedere ho le inizializzazioni di validazione che hai citato nel gestore di caricamento del documento. – blue

+1

Oh, non è necessario eseguire tali inizializzazioni su document.load. Tutto quello che devi fare è includere gli script jquery, jquery.validation e jquery.validation.unobtrusive nella tua pagina. Inoltre, secondo il codice che hai mostrato, sembra che tu abbia sottoscritto il gestore '.validate' del modulo e dichiari alcune convalide personalizzate. Ma non è affatto come funziona la convalida discreta ASP.NET MVC e jQuery. Devi davvero scegliere tra l'uso di annotazioni di dati sul tuo modello di vista (cose come l'attributo '[Required]') o la definizione completa delle tue regole di convalida lato client personalizzate. –

+0

Se decidi di scrivere le tue regole di convalida personalizzate (iscriviti al metodo '.validate' del modulo), allora dovresti rimuovere lo script' jquery.unobtrusive.validation.js' dalla tua pagina. Queste 2 cose sono completamente incompatibili. Quindi spetta a te decidere: o usi l'ASP.NET MVC integrato (e usi gli attributi di validazione come '[Required]' sul tuo modello di vista) o usi il plugin jquery.validate in modo indipendente e scrivi le tue regole personalizzate. Ma non mescolare mai i due perché sono incompatibili. –

0

Se si desidera risolvere a livello globale, questo dovrebbe essere d'aiuto. Ho usato in _layout.cstml.

$(document).ajaxStart(function() { 
       $.ajaxSetup({ 
        converters: { 
         "text html": function (textValue) { 
          if (textValue) { 
           // Some parsing logic here 
           var script = "<script type='text/javascript' language='javascript' > $.validator.unobtrusive.parse(\"form\");"; 
           var scriptend = "\<\/script>"; 
           return script + scriptend + " " + textValue; 
          } else { 
           // This will notify a parsererror for current request 
           throw exceptionObject; 
          } 
         } 
        } 
       }); 
      }); 
Problemi correlati