lato client che convalida gli elementi del modulo generati dynamicmente in mvc 3.0

Ho letto molto su come convalidare il contenuto generato dynamicmente in mvc 3.0 come quello che ha scritto xhalent , ma non riesco a capire come usarlo nel mio codice. Voglio dire che non funziona per gli elementi del modulo generati dynamicmente. Ecco le mie classi di modelli:

public class Person { [Required] public string Name { get; set; } [Required] public string Phone { get; set; } public IList
Addresses{get;set;} public Person() { Addresses = new List
() { new Address(){Street="1"},new Address(){Street="2"} }; } } public class Address { [Required(ErrorMessage="Error")] public string Street { get; set; } }

E questa è la visualizzazione in cui viene visualizzato il modulo:

 <script src="" type="text/javascript"> <script src="" type="text/javascript"> <script src="" type="text/javascript">   
Person

  $().ready(function () { $("#add-phone").click(function () { $.ajax({ url: '', success: function (data) { $(".phone-numbers").append(data); } }); }); }); 

E questa è la vista parziale per Indirizzo:

 
m.Street) %> m.Street)%> m.Street) %>

Innanzitutto, se la tua vista parziale, aggiungi questo in alto

 <% if (Html.ViewContext.FormContext == null) { Html.ViewContext.FormContext = new FormContext(); } %> 

Questo dovrebbe aggiungere attributi di validazione dati val-* discreti al contenuto generato. E nella tua funzione di successo del download di una jax, inseriscilo alla fine

  $().ready(function () { $("#add-phone").click(function () { $.ajax({ url: '<%: Url.Action("GetNewAddress") %>', success: function (data) { $(".phone-numbers").append(data); $("form").removeData("validator"); $("form").removeData("unobtrusiveValidation"); $.validator.unobtrusive.parse("form"); } }); }); }); 

Questa volta dovrebbe analizzare automaticamente il contenuto scaricato e applicare le convalide ad esso

Ho dato un’occhiata al tuo progetto e ho scoperto che la ragione della validazione dynamic non funzionava. Praticamente hai più problemi là fuori della convalida. Innanzitutto, la tecnica che utilizzi per il rendering degli indirizzi non è corretta. In questo modo, tutti gli input generati hanno lo stesso id e i valori dei nomi. Questo è il motivo per cui il validatore non può distinguere tra i contenuti aggiunti dynamicmente e quelli precedenti, pensa che tutti gli input siano gli stessi e convalida tutte le strade in base alla prima strada. Inoltre, se hai postato quel contenuto da creare sul server, il legatore di modelli mvc asp.net non avrebbe potuto bind la matrice di strade, per lo stesso motivo per cui il validatore non può funzionare. Dai un’occhiata a questo articolo per una corretta generazione di contenuti di elenchi sul lato client. E per dopo, iniezione dynamic, puoi cambiare il codice del controller come

 public ActionResult GetNewAddress(string id) { ViewData.TemplateInfo.HtmlFieldPrefix = string.Format("[{0}]", id); return View("EditorTemplates/Addresses", new Address()); } 

Passare l’id corretto dal lato del cliente dipende da voi :).

Inoltre, non usi correttamente EditorTemplates, sono pensati per essere usati con Html.DisplayFor() , e non dovresti specificare il loro nome a mano. Leggi di più su di loro, ci sono dozzine di articoli sul web