33

Attualmente sto affrontando un problema con la convalida dopo l'aggiunta dinamica del contenuto.La convalida non invadente non funziona sulla vista parziale aggiunta dinamicamente

Ho una vista fortemente digitato su un modello (Order). Questo ordine può avere molti articoli. Il modello è simile al seguente:

public class Order 
{ 
    [Key] 
    [HiddenInput] 
    public int id { get; set; } 

    [Display(Name = "Order Number")] 
    public string number { get; set; } 

    [Display(Name = "Order Date")] 
    [DataType(DataType.Date)] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")] 
    public DateTime date { get; set; } 

    [Required(ErrorMessage = "Beneficiary is required.")] 
    [Display(Name = "Beneficiary")] 
    public int beneficiary_id { get; set; } 

    [Display(Name = "Beneficiary")] 
    public Beneficiary beneficiary { get; set; } 

    [Display(Name = "Items")] 
    public List<Item> items { get; set; } 

    [Display(Name = "Payment Method")] 
    public List<PaymentMethod> payment_methods { get; set; } 
} 

Inserisco le informazioni dell'ordine e anche le voci per quello specifico ordine. Ho provato un paio di modi per aggiungere contenuti dinamicamente e alla fine sono andato con Steven Sanderson's way.

A mio avviso, non ho le informazioni di regolare ordine e poi le voci, in cui il mio modello simile a questa:

@model trackmeMvc.Models.Model.Order 
@{ 
    ViewBag.Title = "Create"; 
    Html.EnableClientValidation(); 
    Html.EnableUnobtrusiveJavaScript(); 
} 

<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/MicrosoftAjax.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script> 

@using (Html.BeginForm("Create", "Order", FormMethod.Post, new { @id = "create_order" })) 
    { 
    @Html.ValidationSummary(true, "Order creation was unsuccessful. Please correct the errors and try again.") 

    <div class="editor-label"> 
     @Html.LabelFor(m => m.date)<req>*</req> 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(m => m.date, new { @id = "order_date" })<br /> 
     @Html.ValidationMessageFor(m => m.date) 
    </div> 

...

<script type="text/javascript"> 

    $(document).ready(function() { 

     $("#addItem").click(function() { 

      var formData = $("#main_div").closest("form").serializeArray(); 

      $.ajax({ 
       url: "/IPO/BlankItemRow", 
       type: "POST", 
       //data: formData, 
       cache: false, 
       success: function (html) { 
        $("#editorRows").append(html); 
         //$.validator.uobtrusive.parseDynamicContent("form *"); 
         //$("#editorRows").removeData("validator"); 
         //$("#editorRows").removeData("unobtrusiveValidation"); 
         //$.validator.unobtrusive.parse("#editorRows"); 
         //$.validator.unobtrusive.parse("#create_ipo"); 
         //$.validator.unobtrusive.parseDynamicContent($(this).first().closest("form")); 
         //$.validator.unobtrusive.parse($("#new_ipo_item")); 

         //$.validator.unobtrusive.parseElement($("#editorRows").find(".editRow:last").children().find("select")); 
          //$("#editorRows").find(".editRow:last").find("select").each(function() { 
          //alert($(this).attr("id")); 
          //$.validator.unobtrusive.parseElement($(this)); 
          //$.validator.unobtrusive.parseDynamicContent($(this)); 
          //$.validator.unobtrusive.parseDynamicContent($(this).attr("name")); 
         //}); 
          //$("#editorRows").children().find(".editRows:last").find("*").each(function() { 
          // alert($(this).attr('id')); 

          //$.validator.unobtrusive.parseDynamicContent('input'); 
         //}); 
         //var form = $(this).closest("form").attr("id"); 
         //$(form).removeData("validator"); 
         //$(form).removeData("unobtrusiveValidation"); 
         //$.validator.unobtrusive.parse(form); 
        } 
       }); 
      return false; 
     }); 
    }); 

</script> 

Queste sono alcune delle cose Ho provato, e niente funziona.

Ho ricevuto il parseDynamicContent da Applying unobtrusive jquery validation to dynamic content in ASP.Net MVC. L'ho provato in ogni scenario a cui potessi pensare, ma ancora senza fortuna.

Ho anche provato il parse regolare, eliminando la convalida dalla forma applicando poi di nuovo, ma ancora gli elementi appena aggiunti non vengono convalidati:

<div id="editorRows"> 
    @foreach (var item in Model.items) 
    { 
     @Html.Partial("_NewItem", item) 
    } 
</div> 

... e la mia vista parziale sarebbe simile a questa :

@model trackmeMvc.Models.Model.Item 

@{ 
    Layout = "";  
    Html.EnableClientValidation(true); 

    if (this.ViewContext.FormContext == null) 
    { 
     this.ViewContext.FormContext = new FormContext(); 
    } 
} 

<div class="editRow"> 

@using (Html.BeginCollectionItem("order_items")) 
{ 

    @Html.DropDownListFor(m => m.item_id, @items, "None", new { @style = "width:205px;", @id = "ddlItems", @class="ddlItem", @name="ddlItemList" }) 
    @Html.ValidationMessageFor(m => m.item_id) 

    ... 

} 

</div> 

Quindi, quello che sta succedendo è che ho una voce vuota inviato dal controller alla vista di default, per mostrare una riga vuota. L'elemento è convalidato, ma qualunque cosa succeda dopo aver fatto clic su aggiungi elemento, viene visualizzata un'altra riga, da quella parziale, ma non riesco a farla convalidare. Ho provato a mettere la convalida nella vista parziale, (prima che il documento fosse pronto nella forma principale), e tutto ciò che ho letto ho applicato, e finisce sempre nello stesso modo: convalidare la prima riga, e non le altre. Ho provato la validazione di Steven Sanderson fatto a tal fine - ancora senza fortuna - anche la convalida per i partial, trovato at this link e la pagina che segue, che è specifico per la convalida parziale ...

Cosa devo fare per ottenere questo validazione funzionante?

+0

possibile duplicato di [jquery.validate.unobtrusive che non funziona con elementi di input dinamico] (http://stackoverflow.com/questions/4406291/jquery-validate-unobtrusive-not-working-with-dynamic-injected-elements) – Liam

risposta

82

Ok, ho intenzione di ricominciare con una nuova risposta qui.

Prima di chiamare $.validator.unobtrusive.parse, rimuovere il validatore originale e convalida discreto dalla forma in questo modo:

var form = $("#main_div").closest("form"); 
form.removeData('validator'); 
form.removeData('unobtrusiveValidation'); 
$.validator.unobtrusive.parse(form); 

Questa stessa risposta è documentato here.

+0

Ciao e grazie per la tua risposta. Sto usando MVC 3 e mi dispiace per "order_items", in realtà è "articoli" solo un refuso. e il @items è una lista di selezione che ottengo dal database di tutti gli articoli ..negli articoli della classe di ordine sono richieste tutte le proprietà dell'articolo e ciò che accade è nel mio controller, ho messo un elemento vuoto per impostazione predefinita e quella riga è convalidata, sul lato client. Quindi ho sostituito lo script per non utilizzare la versione minified come suggerito. Ora ho controllato e data-val = "true" e tutto ciò che viene aggiunto al controllo aggiunto in modo dinamico. Continua ... – noobi

+0

così quando provo a rimuovere la convalida non invadente non c'è più, e quando provo a metterlo indietro, convalida solo gli elementi che erano nella pagina del primo pugno, nulla che sia stato aggiunto dinamicamente .. ho provato a eseguire il debug con chrome, ma quando ho colpito $ .validator.unobtrusive.parse ($ ("# main_div ") .closest (" forma ")); va alla fine della funzione che colpisce il file di script "jquery-1.5.1.min.js" non dovrebbe andare allo script di validazione? non ho molta familiarità con questa cosa di debug del chrome .. ma dove può essere il link mancante? perché quando rimuovo i validatori e li riaggiungi essi vanno a lavorare di nuovo – noobi

+0

che significa che è stato chiamato, ma per qualche ragione, non sta influenzando il contenuto aggiunto dinamicamente, sta solo convalidando tutto ciò che era lì per iniziare prima di aggiungere qualsiasi controllo. . Che cosa potrebbe essere? – noobi

Problemi correlati