ASP.NET 查看 IEnumerable 项目验证



我有这个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"属性输入不正确的值时,所有其他文本输入都会出现验证错误。

解决 方案?

谢谢。

我会从表元素中删除"@:"。同样使用剃刀语法,我会生成一个表单标签。这可能与此有关。此外,添加验证摘要方法。您发布的那个片段是完整的视图吗?

@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>
    }
}

如果是分部视图,请确保属性"Name"在视图中的任何其他字段中都不存在。"名称"非常通用,也许您应该将其重命名为更具描述性的名称。"全名"、"产品名称"。等。。。。

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

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

假设您的模型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)

这可以通过在视图中创建仅用于验证目的的模型的另一个实例来解决。

@{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" })

最新更新