2013-05-18 3 views
0

Вкратце - в моем представлении атрибуты проверки данных добавляются только для входов объекта firs из colletion. Я хочу иметь возможность проверять входные данные любого объекта коллекции на моем представлении. Я использую Asp.net MVC4, jquery.validate.unobtrusive.Проверка клиента для сбора предметов Asp.Net MVC

Подробнее: У меня есть страница администратора в моем проекте, где я хочу удалить все категории продуктов. Любая из этих категорий может быть отредактирована. В конце процесса редактирования пользователь может нажать кнопку, чтобы сохранить все изменения.

Мои ViewModel:

public class CategoriesManagementViewModel 
{ 
    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    public int Id { get; set; } 

    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    [StringLength(50, ErrorMessage = Validation.MaxLength50Msg)] 
    public string Name { get; set; } 

    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    [Range(0, int.MaxValue, ErrorMessage = Validation.PositiveNumberMsg)] 
    public int AmountForDiscount { get; set; } 

    [Required(ErrorMessage = Validation.FieldRequiredMsg)] 
    [Range(0, 100, ErrorMessage = Validation.PercentMsg)] 
    public int DiscountPercent { get; set; } 

    public bool IsActive { get; set; } 
} 

Здесь вы контроллер:

public JsonResult GetProductCategories(int currentPage) 
    { 
     using (var service = new DalServiceSoapClient()) 
     { 
      var data = service.GetProductCategories(currentPage, Constants.ItemsOnPage,false) 
       .Select(x=> new CategoriesManagementViewModel(x)); 
      var html = RenderRazorViewToString("_ManageCategoriesPartial", data); 
      return Json(new { status = "success", html = html }); 
     } 

    } 

В контроллере я получаю данные из БД, превращая его в коллекцию моих ViewModels и переходя к частичным видом. Частичное представление отображается в строке html, отправленной как json, и часть моего представления обновляется.

Здесь представлен частичный вид:

@model IEnumerable<GreenLightShop.Models.CategoriesManagementViewModel> 
@{ 
    Layout = null; 
    var i = 0; 
} 

@foreach (var item in Model) 
{ 
    var blockedClass = "";  
    var blockBtnCaption = "Block"; 

if (!item.IsActive) 
{ 
    blockedClass = "blocked"; 
    blockBtnCaption = "UnBlock"; 
} 

<div class='box @blockedClass' itemid="@item.Id" ischanged="false" isactive  ="@item.IsActive"> 

    <div class="show"> 
     <span>@item.Name</span> 
     |&nbsp;<a href="#" class="edit-category-btn">Edit Category</a> 
     |&nbsp;<a href="#" class="edit-products-btn">Edit Product</a> 
     |&nbsp;<a href="#" class="block-btn"> @blockBtnCaption </a> |&nbsp; 
    </div> 
    <form class="edit hidden"> 

     <div class="form-field"> 
      <label> Name:</label> 
      @Html.TextBoxFor(x => x.ElementAt(i).Name) 
     @* @Html.HiddenFor(x=>x.ElementAt(i).Name)*@ 
      <div> 
       @Html.ValidationMessageFor(x => x.ElementAt(i).Name)  
      </div> 
     </div> 

     <div class="form-field"> 
      <label> Amount For Discount:</label> 
      @Html.TextBoxFor(x => x.ElementAt(i).AmountForDiscount) 
      @* @Html.HiddenFor(x => x.ElementAt(i).AmountForDiscount)*@ 
      <div> 
       @Html.ValidationMessageFor(x => x.ElementAt(i).AmountForDiscount)  
      </div> 
     </div> 

     <div class="form-field"> 
      <label> Discount:</label> 
      @Html.TextBoxFor(x => x.ElementAt(i).DiscountPercent) 
      @* @Html.HiddenFor(x => x.ElementAt(i).DiscountPercent)*@ 
      <div> 
       @Html.ValidationMessageFor(x => x.ElementAt(i).DiscountPercent)  
      </div> 
     </div> 

     <input type="button" class="accept-changes-btn" value="Apply"/> 
     <input type="button" class="cancel-changes-btn" value="Cancel"/> 
    </form> 
</div> 

    i++; 
} 

Для первого элемента IEnumerable<GreenLightShop.Models.CategoriesManagementViewModel>, атрибуты валидации добавляются к каждому входу на форме.

<input id="Name" type="text" value="CategoryName" name="Name" data-val-required="This field is required." data-val-length-max="50" data-val-length="Not longer than 50 characters." data-val="true">. 

Валидация работает нормально.

Входы всех атрибутов проверки всех категорий не добавляются.

<input id="Name" type="text" value="AnotherCategory" name="Name"> 

, когда пользователь нажимает

<input type="button" class="accept-changes-btn" value="Apply"/>`, 

Я разбор поля ввода модифицированной категории с $.validator.unobtrusive.parse($(this));

Все категории отображаются нормально, и когда я представить изменения Model.IsValid отлично работает и связывание данных также работает.

Как я могу сделать валидацию для каждой категории?

Заранее спасибо.

ответ

0

Решение проблемы: Проблема была в том, что для каждой формы я использовал тег <Form>. Когда я изменил его на @using(Html.BeginForm()) проблема была исправлена. Теперь каждый вход в каждой форме на моем представлении имеет атрибуты проверки.

Если кто-нибудь знает объяснение, почему это происходит, я бы хотел его услышать.