ASP.NET View IEnumerable Item验证

时间:2017-01-11 20:15:46

标签: asp.net-mvc razor asp.net-validators

我有这个ASP:NET MVC Razor View,它有一个IEnumerable作为模型。

我正在创建一个表,其中每一行代表IEnumerable中的一个项目。

我正在使用此代码:

@foreach (var item in Model)
{
    <tr>
        <td>
            <input type="checkbox" name="selectedFoo" value="@item.isAdded"
               @(Html.Raw(item.isAdded? "checked=\"checked\"" : "")) />
            @item.FooName
        </td>

        <td>
            @Html.EditorFor(modelItem=> item.Name, new { htmlAttributes = new { @class = "form-control", style = "width: 70px" } })
            @Html.ValidationMessageFor(modelItem=> item.Name, "", new { @class = "text-danger" })

        </td>

     </tr>
}

我的问题是,当我为“Name”属性输入一个不正确的值时,所有其他文本输入都会收到验证错误。

解决方案?

谢谢。

3 个答案:

答案 0 :(得分:0)

我会删除&#39; @:&#39;来自表格元素。同样使用剃刀语法我会生成一个表单标签。这可能与它有关。还要添加ValidationSummary方法。 那个片段是你发布的完整视图吗?

@using (Html.BeginForm())
{
@Html.ValidationSummary(true, "", new class{@class="text-danger"})
    @foreach (var item in Model)
    {
        <tr>
           <td>
                <input type="checkbox" name="selectedFoo" value="@item.isAdded"
                   @(Html.Raw(item.isAdded? "checked=\"checked\"" : "")) />
                @item.FooName
            </td>

            <td>
                @Html.EditorFor(modelItem=> item.Name, new { htmlAttributes = new { @class = "form-control", style = "width: 70px" } })
                @Html.ValidationMessageFor(modelItem=> item.Name, "", new { @class = "text-danger" })

            </td>
         </tr>
    }
}

如果是部分视图,请确保该属性&#39;名称&#39;在视图中的任何其他字段上都不存在。 &#39;名称&#39;是非常通用的,也许你应该将它重命名为更具描述性的东西。 &#39; FullName&#39;,&#39; ProductName&#39;。 ECT ....

答案 1 :(得分:0)

您的foreach循环为每个文本框生成重复的name属性,ValidationMessageFor()适用于具有该名称的所有元素。此外,在提交表单时,您将永远无法绑定到您的模型。

您需要使用for循环或自定义EditorTemplate来生成元素(有关更多详细信息,请参阅this answer

假设您的模型是IList<T>,那么

@for(int i = 0; i < Model.Count; i++)
{
    @Html.EditorFor(m => m[i].Name, new { htmlAttributes = new { @class = "form-control", style = "width: 70px" } })
    @Html.ValidationMessageFor(m => m[i].Name, "", new { @class = "text-danger" })
}

此外,使用CheckBoxFor()方法生成复选框(假设selectedFoo类型为bool

@Html.CheckBoxFor(m => m[i].selectedFoo)
@Html.LabelFor(m => m[i].selectedFoo, Model[i].FooName)

答案 2 :(得分:0)

可以通过仅在视图中创建模型的另一个实例来解决该问题。

@{YourNameSpace.Models.Model ValidationModel = new YourNameSpace.Models.Model ();}

比您可以按以下形式使用它:

<div class="form-group">                            
   <input asp-for="@ValidationModel.PropertyName" name="[0].Name" class="form-control" />
   <span asp-validation-for="@ValidationModel.PropertyName" class="text-danger"></span>
</div>

或使用HTML帮助器:

@Html.ValidationMessageFor(modelItem => ValidationModel.Name, "", new { @class = "text-danger" })