-1

我有这个 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>
}

我的问题是,当我为“名称”属性输入不正确的值时,所有其他文本输入都会出现验证错误。

解决方案?

谢谢你。

4

3 回答 3

0

您的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是 typeof bool

@Html.CheckBoxFor(m => m[i].selectedFoo)
@Html.LabelFor(m => m[i].selectedFoo, Model[i].FooName)
于 2017-01-11T21:09:03.100 回答
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" })
于 2019-02-24T09:59:37.333 回答
0

我会从表格元素中删除“@:”。同样使用剃刀语法,我会生成一个表单标签。这可能与它有关。还要添加 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>
    }
}

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

于 2017-01-11T20:23:34.837 回答