Вкратце - в моем представлении атрибуты проверки данных добавляются только для входов объекта 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>
| <a href="#" class="edit-category-btn">Edit Category</a>
| <a href="#" class="edit-products-btn">Edit Product</a>
| <a href="#" class="block-btn"> @blockBtnCaption </a> |
</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 отлично работает и связывание данных также работает.
Как я могу сделать валидацию для каждой категории?
Заранее спасибо.