我正在为父实体开发一个表单,其中包含子实体列表。
在 Parent.cshtml 中,我使用 foreeach 在部分 View 中渲染子项:
@foreach (var child in Model.Children)
{
Html.RenderPartial("_Child", child);
}
在 _Child.cshtml 中我使用以下代码:
@using (Html.BeginCollectionItem("Children"))
{
@Html.EditorFor(model => Model.ValidatedProperty, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => Model.ValidatedProperty, "", new {@class = "text-danger"})
}
当表单发送回服务器时,我需要向 Child.ValidatedProperty 添加验证。 ValidatedProperty 中的值必须按升序排列。 对于给定的子实体,如果前面的任何子实体在 ValidatedProperty 中具有较高的值,或者如果以下任何子实体具有较低的值,则 ValidatedProperty 无效。
当我尝试实现这一点时,我遇到了以下问题:
当我尝试在 Controller 操作中进行验证并使用时
ModelState.AddModelError("Parent.Children.Child[" + i + "].ValidatedProperty", "Please enter a value between " + prev + " and " + next);
该消息未出现在屏幕上。
当我尝试创建 ValidationAttribute 或使用 IValidatableObject 接口(interface)时,我无法访问前面和后面的子实体,因此我无法从那里进行验证。
当我查看源代码时,我的 ValidationMessage html 节点具有以下标记:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Children[533f90da-4c11-40ca-bb07-e3f6bcbd7260].ValidatedProperty"></span>
非常欢迎所有建议! 如果我需要提供更多信息,请告诉我您需要了解什么。 谢谢!
附注这是我想要做的事情的简化版本,真正的验证比仅仅检查正确的顺序要复杂一些。
编辑: 看来对 Html.BeginCollection 的调用正在将 Children[533f90da-4c11-40ca-bb07-e3f6bcbd7260] 部分添加到验证元素的名称中。当我删除 BeginCollection 语句时,它显示为:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="ValidatedProperty"></span>
不幸的是,我需要 BeginCollection 语句来实现页面的其他功能。有什么方法可以使验证消息与 BeginCollection 一起使用吗?
已解决:
当我像 teo van kot 一样使用 EditorTemplate 时,我可以删除 BeginCollectionItem 语句,并且每个 Child 现在都以数字而不是 guid 为前缀。现在我的 AddModelError 语句可以正常工作。
最佳答案
我不确定,但我猜你用 Html.RenderPartial()
打破了你的绑定(bind)。这就是为什么当您使用 ModelState.AddModelError()
添加错误时它没有出现。
我建议你使用 EditorTemplate而不是Html.RenderPartial()
.
您应该创建文件夹EditorTemplates
在Views\Shared
并为您的 Model.Children
创建强类型 View 属性与您的Children
同名属性类型有。
基本上,它将与您现在在 _Child
下拥有的 View 相同。名称。
然后更改:
@foreach (var child in Model.Children)
{
Html.RenderPartial("_Child", child);
}
致:
@Html.EditorFor(x => x.Children)
请注意,您不需要设置模型 IEnumerable<YourType>
或List<YourType>
因为即使您传递集合,EditorTemplates 仍然可以工作。
现在所有绑定(bind)都可以了。您可以使用F12键在浏览器中检查它并检查您的ValidatedProperty
input
name
属性。然后您就可以使用您的ModelState.AddModelError()
方法。
关于c# - 如何同时对多个对象进行验证并将其添加到部分 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36041741/