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> 

Таковы некоторые из вещей, Я пробовал, и ничего не работает.

Я получил parseDynamicContent от Applying unobtrusive jquery validation to dynamic content in ASP.Net MVC. Я попробовал это в каждом сценарии, о котором я мог думать, но все равно не повезло.

Я также попробовал регулярные разобрана, удаление проверки из формы затем применить его снова, но все же вновь добавленные элементы не проверяются:

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

Так что же происходит, у меня есть один пустой элемент, посланный от контроллера к представлению по умолчанию, чтобы показать одну пустую строку. Этот элемент проверен, но все, что приходит после того, как я нажимаю кнопку «Добавить элемент», появляется другая строка из этого частичного, но я не могу его проверить. Я попытался выполнить проверку в частичном представлении (до того, как документ готов в основной форме), и все, что я прочитал, я применил, и он всегда заканчивается тем же: проверка первой строки, а не других. Я попробовал проверку Стивен Сандерсон сделал для этой цели - еще не повезло - даже проверки для обертонов, нашел 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

Привет и спасибо за ваш ответ. Я использую MVC 3, и сожалею о «order_items», это на самом деле «элементы», только опечатка. и @items - это список выбора, который я получаю из базы данных всех элементов.в списке элементов класса заказа требуются все свойства элемента, а то, что происходит в моем контроллере, я по умолчанию ставил один пустой элемент и эта строка проверялась на стороне клиента. Поэтому я заменил скрипт не использовать мини-версию, как вы предложили. Теперь я проверил и data-val = «true» и все, что добавляется в динамически добавленный элемент управления. Продолжение ... – noobi

+0

поэтому, когда я пытаюсь удалить ненавязчивую проверку, она исчезла, и когда я попытаюсь ее поместить назад, он проверяет только те элементы, которые были на загрузке первой страницы, ничего, что было добавлено динамически. Я попытался отладить с помощью chrome, но когда я ударил $ ​​.validator.unobtrusive.parse ($ ("# main_div ") .closest (" форма ")); он доходит до конца функции, когда файл сценария «jquery-1.5.1.min.js» не должен идти в скрипт проверки подлинности? я не слишком хорошо разбираюсь в этой хром-отладке. Но где может отсутствовать ссылка? потому что, когда я удаляю валидаторы и снова добавляю их, они снова и снова работают и работают снова – noobi

+0

, что означает, что он вызывается, но по какой-то причине он не влияет на динамически добавленный контент, он только проверяет все, что было там, прежде чем добавлять какие-либо элементы управления. так что это может быть? – noobi

Смежные вопросы