我有这个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”属性输入一个不正确的值时,所有其他文本输入都会收到验证错误。
解决方案?
谢谢。
答案 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" })