Проверка клиента для сбора элементов Asp.Net MVC

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

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

Моя модель просмотра:

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

    }

В контроллере я получаю данные из db, конвертирую их в коллекцию моих ViewModels и перехожу в Partial View. Частичное представление отображается в строку 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 работает нормально, и привязка данных также работает.

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

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


person Iliya Krinchiyan    schedule 18.05.2013    source источник


Ответы (1)


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

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

person Iliya Krinchiyan    schedule 19.05.2013