2013-09-10 3 views
0

Вот мой продукт и классы ProductItem/модели:MVC 4 Проверка атрибутов не работает для динамически добавляемых полей

public class Product 
     { 
      public int ProductId { get; set; } 
      [Required(ErrorMessage="Enter Name")] 
      public string Name { get; set; } 
      public List<ProductItem> productitems { get; set; } 
      [Required(ErrorMessage="Enter Price")] 
      public decimal Price { get; set; } 
     } 
    public class ProductItem 
     { 
      [Required(ErrorMessage="Select Raw Material")] 
      public int RawMaterial { get; set; } 
      [Required(ErrorMessage="Enter Quantity")] 
      public decimal Qty { get; set; } 
     } 

Для ProductItem Я добавляю его поля динамически с помощью JQuery, как вы можете увидеть здесь:

$("#btnAddProductItem").click(function() { 
     $.getJSON("/rawmaterial/GetRawMaterials", null, function (data) { 
      var productItem = $("<tr class='productItem' id='productItem-0'><td><select id='rmlist-0' name='productitems[0].RawMaterial'></select><span class='field-validation-valid' data-valmsg-for='productitems[0].RawMaterial' data-valmsg-replace='true'></span></td><td><input type='text' id='rmqty-0' name='productitems[0].Qty'/><span class='field-validation-valid' data-valmsg-for='productitems[0].Qty' data-valmsg-replace='true'></span></td></tr>"); 
      $("#productItem").append(productItem); 
      $("#rmlist-0").addItems(data); 
     }); 
    }); 

Теперь атрибуты проверки, применяемые к имени и цене, работают нормально, но не на добавленных динамиках (т. Е. «RawMaterial» и «Qty»).

Пожалуйста, дайте мне советы, как эта валидация будет работать?

Примечание: Для целей тестирования я просто добавил первый объект списка индексируются с 0.

+0

Возможный дублированный вопрос http://stackoverflow.com/questions/10023503/unobstructive-client-side-validation-for-dynamically-added-input-fields – asymptoticFault

+0

Пожалуйста, предложите любое другое решение, разбор форм не является решением в моей case –

+0

Когда вы говорите, что они не работают, вы имеете в виду сторону клиента или сервера? Можете быть более конкретными? – asymptoticFault

ответ

0

Есть несколько способов сделать это -

  1. ЧАСТИЧНЫЙ VIEW: Поскольку вы используя аннотацию данных на стороне сервера, как я вижу из определений классов, тогда динамически динамически загружать js не рекомендуется. Потому что вы пропустите всю проверку, которую MVC 4 мог создать автоматически. Итак, лучшее решение, которое я бы предложил, - это взять код, который вы динамически добавляете в файл частичного просмотра, а затем получить html с помощью ajax-вызова и затем заполнить HTML.

  2. JS VALIDATION: Но, если это необходимо, чтобы вы использовали JS, вам нужно добавить все элементы проверки самостоятельно. Для этого вы должны сделать некоторые дополнительные работы -

    • во-первых, проверить HTML с любыми инструментами разработчика, вы заметите, что есть атрибут <span> добавляется после каждого элемента, чтобы показать ошибку, которая имеет цель упомянутой , Вы должны добавить аналогичные атрибуты к своим элементам

    • С ненавязчивой проверкой MVC 4 все атрибуты и правила проверки добавляются с целевым элементом с атрибутами data. Каждый из них основан на проверке, на которую они указывают. У вас есть атрибуты, подобные этому.

    • Наконец, после добавления всех элементов проверки в JS, сбросьте форму так, чтобы она анализировала новые валидации, добавленные и работающие соответственно. Код для разбора валидаций здесь -

      var form = $("form") //use more specific selector if you like 
      form.removeData("validator").removeData("unobtrusiveValidation"); 
      $.validator.unobtrusive.parse(form); 
      

Но я предпочел бы частичное решение вида, так как это потребует минимума количества повторной работы, а также дает возможность сохранить все ваши валидация в одном месте. Вам не нужно беспокоиться о новых валидациях, которые будут перенесены в js в будущем.

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