gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:50:54 24 4
gpt4 key购买 nike

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

在 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 同名的属性(property) 属性类型有

基本上,它与现在在 _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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com