33

पर काम नहीं कर रहा अविभाज्य सत्यापन मैं वर्तमान में सामग्री को गतिशील रूप से जोड़ने के बाद सत्यापन के साथ एक समस्या का सामना कर रहा हूं।गतिशील रूप से जोड़ा गया आंशिक दृश्य

मेरे पास एक मॉडल (Order) दृढ़ता से टाइप किया गया है। इस आदेश में कई वस्तुएं हो सकती हैं। मॉडल निम्न जैसा दिखता है:

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; } 
} 

मैं ऑर्डर जानकारी और उस विशिष्ट क्रम के आइटम भी दर्ज करता हूं। मैंने सामग्री को गतिशील रूप से जोड़ने के कुछ तरीकों की कोशिश की और आखिरकार Steven Sanderson's way के साथ चला गया।

@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> 

उन चीजों में से कुछ हैं:

मेरे विचार में, मैं नियमित रूप से आदेश जानकारी और फिर आइटम है, जहां अपने मॉडल कुछ इस तरह दिखता है मैंने कोशिश की, और कुछ भी काम नहीं करता है।

मुझे Applying unobtrusive jquery validation to dynamic content in ASP.Net MVC से parseDynamicContent मिला। मैंने इसे हर परिदृश्य में करने की कोशिश की जिसे मैं सोच सकता था, लेकिन अभी भी कोई भाग्य नहीं है।

मैं भी नियमित रूप से पार्स की कोशिश की, रूप से मान्यता को हटाने तो यह फिर से लागू करने, लेकिन अभी भी नए जोड़े तत्वों मान्य नहीं हैं:

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

... और मेरे आंशिक दृश्य कुछ इस तरह दिखेगा :

@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> 

तो क्या हो रहा है मैं एक खाली डिफ़ॉल्ट रूप से देखने के लिए नियंत्रक से भेजे गए आइटम, एक रिक्त पंक्ति दिखाने के लिए, है। वह आइटम मान्य है, लेकिन जब भी मैं आइटम जोड़ता हूं, तब भी जो भी आता है, उस आंशिक से दूसरी पंक्ति दिखाई देती है, लेकिन मैं इसे सत्यापित करने के लिए नहीं मिल सकता। मैंने आंशिक दृश्य में सत्यापन को प्रस्तुत करने की कोशिश की, (दस्तावेज़ को मुख्य रूप में तैयार करने से पहले), और मैंने जो कुछ भी पढ़ा, मैंने इसे लागू किया, और यह हमेशा समाप्त होता है: पहली पंक्ति को मान्य करना, न कि दूसरों को। फिर भी प्रयास विफल - - मैं स्टीवन सैंडरसन के सत्यापन उस उद्देश्य के लिए किया की कोशिश की partials के लिए भी सत्यापन, at this link और जो आंशिक सत्यापन के लिए विशिष्ट है पृष्ठ इस प्रकार है कि ...

क्या मैं इसे पाने के लिए क्या करना चाहिए पाया सत्यापन काम कर रहा है?

+0

की [काम नहीं कर रहा jquery.validate.unobtrusive गतिशील इंजेक्शन तत्वों के साथ] संभव डुप्लिकेट (http://stackoverflow.com/questions/4406291/jquery-validate-unobtrusive-not-working-with-dynamic-injected-elements) – Liam

उत्तर

82

ठीक है, मैं यहां एक नए उत्तर के साथ शुरू करने जा रहा हूं।

इससे पहले कि आप $.validator.unobtrusive.parse फोन है, तो जैसे रूप से मूल सत्यापनकर्ता और विनीत सत्यापन निकालें:

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

यह वही जवाब here प्रलेखित है।

+0

हाय और आपके उत्तर के लिए धन्यवाद। मैं एमवीसी 3 का उपयोग कर रहा हूं, और "order_items" के बारे में खेद है, यह वास्तव में "आइटम" केवल एक टाइपो है। और @items एक चुनिंदा सूची है जिसे मैं सभी वस्तुओं के डेटाबेस से प्राप्त करता हूं ..ऑर्डर क्लास की सूची आइटम में सभी आइटम गुणों की आवश्यकता है, और मेरे नियंत्रक में क्या हो रहा है मैं डिफ़ॉल्ट रूप से एक खाली आइटम डालता हूं और उस पंक्ति को क्लाइंट पक्ष पर मान्य किया जाता है। इसलिए मैंने स्क्रिप्ट को प्रतिस्थापित किया है जैसा कि आपने सुझाव दिया है कि न्यूनतम संस्करण का उपयोग न करें। अब मैंने जांच की है और डेटा-वैल = "सत्य" और गतिशील रूप से जोड़े गए नियंत्रण में जो कुछ जोड़ा जा रहा है .. जारी है ... – noobi

+0

इसलिए जब मैं अविभाज्य सत्यापन को हटाने का प्रयास करता हूं तो यह चला जाता है, और जब मैं इसे रखने की कोशिश करता हूं पीछे, यह केवल उन्हीं वस्तुओं को मान्य करता है जो मुट्ठी पृष्ठ लोड पर थे, कुछ भी नहीं जो गतिशील रूप से जोड़ा गया है .. मैंने क्रोम के साथ डीबग करने का प्रयास किया है, लेकिन जब मैंने $ .validator.unobtrusive.parse ($ ("# main_div) ") .closest (" फार्म ")); यह फ़ंक्शन के अंत में जाता है, स्क्रिप्ट फ़ाइल "jquery-1.5.1.min.js" हिट करता है, क्या यह वैधकर्ता स्क्रिप्ट पर नहीं जाना चाहिए? मैं इस क्रोम डीबगिंग चीज़ से बहुत परिचित नहीं हूं .. लेकिन गायब लिंक कहां हो सकता है? क्योंकि जब मैं वैधकर्ताओं को हटा देता हूं और उन्हें फिर से जोड़ता हूं तो वे जाते हैं और फिर से काम करते हैं – noobi

+0

जिसका अर्थ है कि इसे कहा जा रहा है, लेकिन किसी कारण से, यह गतिशील रूप से जोड़े गए सामग्री को प्रभावित नहीं कर रहा है, यह केवल उन सभी को मान्य करता है जो किसी भी नियंत्रण को जोड़ने से पहले शुरू होते हैं। तो वह क्या हो सकता है? – noobi