c# - 如何同时对多个对象进行验证并将其添加到部分 View

标签 c# asp.net-mvc validation

我正在为父实体开发一个表单,其中包含子实体列表。

在 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() .

您应该创建文件夹EditorTemplatesViews\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/

相关文章:

C# 控制台应用程序 - 在运行时编辑用户设置

c# - MDIParents Forms 和 Childs 中的事件

c# - 在 asp.net mvc 中检查上传的 Excel 文件中的非法字符

ruby-on-rails - 测试 Rails 中对无效 UTF-8 的优雅处理

validation - 互联网电子邮件的最大消息ID长度

c# - 如何使用C#获取Win7的SSID和RSSI

c# - 'Gravity' 不包含 'CENTER_HORIZONTAL' 的定义

jquery - asp.net MVC4 中的全局化

c# - NopCommerce定制

c# - WPF 属性验证检查属性是否有效