Asp.net mvc Asp.Net MVC项目集合的客户端验证

Asp.net mvc Asp.Net MVC项目集合的客户端验证,asp.net-mvc,validation,unobtrusive-validation,Asp.net Mvc,Validation,Unobtrusive Validation,简言之,在我看来,数据验证属性仅为来自Collection的firs对象的输入添加。我希望能够验证视图上集合的任何对象的输入。我正在使用Asp.net MVC4,jquery.validate.unobtrusive 更详细的信息: 我在我的项目中有一个管理页面,我想显示所有产品类别。这些类别中的任何一个都可以编辑。在编辑过程结束时,用户可以单击按钮保存所有更改 我的ViewModel: public class CategoriesManagementViewModel { [Requ

简言之,在我看来,数据验证属性仅为来自Collection的firs对象的输入添加。我希望能够验证视图上集合的任何对象的输入。我正在使用Asp.net MVC4,jquery.validate.unobtrusive

更详细的信息: 我在我的项目中有一个管理页面,我想显示所有产品类别。这些类别中的任何一个都可以编辑。在编辑过程结束时,用户可以单击按钮保存所有更改

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

    }
在控制器中,我从db中获取数据,将其转换为我的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++;
}
@model IEnumerable
@{
布局=空;
var i=0;
}
@foreach(模型中的var项目)
{
var blockedClass=“”;
var blockbtncoption=“Block”;
如果(!item.IsActive)
{
blockedClass=“blocked”;
blockbtn选项=“取消阻止”;
}
@项目名称
| 
| 
|  | 
姓名:
@TextBoxFor(x=>x.ElementAt(i).Name)
@*@Html.HiddenFor(x=>x.ElementAt(i.Name)*@
@Html.ValidationMessageFor(x=>x.ElementAt(i.Name)
折扣金额:
@Html.TextBoxFor(x=>x.ElementAt(i).AmountForDiscount)
@*@Html.HiddenFor(x=>x.ElementAt(i).AmountForDiscount)*@
@Html.ValidationMessageFor(x=>x.ElementAt(i).AmountForDiscount)
折扣:
@Html.TextBoxFor(x=>x.ElementAt(i).DiscountPercent)
@*@Html.HiddenFor(x=>x.ElementAt(i).DiscountPercent)*@
@Html.ValidationMessageFor(x=>x.ElementAt(i).DiscountPercent)
i++;
}
对于第一个元素
IEnumerable
,验证属性被添加到表单上的每个输入中

<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工作正常,数据绑定也工作正常

如何对每个类别进行验证


提前感谢。

以下是我找到的解决方案: 问题是,对于每个表单,我都使用了
标记。当我使用(Html.BeginForm())将其更改为
@时,
问题得到了解决。现在,我视图中每个表单中的每个输入都有验证属性

如果有人知道解释,为什么会发生这种情况,我很想听听