gpt4 book ai didi

c# - mvc3 ValidationSummary 排除属性错误 IValidatableObject

转载 作者:太空狗 更新时间:2023-10-29 23:18:06 26 4
gpt4 key购买 nike

我的模型(类 A)有一个 B 类型的属性(称为 b),实现了 IValidatableObject

View 有 @Html.ValidationSummary(true)

在验证摘要中,我想排除与属性相关的错误。在 B 类 IValidatableObject 中,实现返回没有 memberNames 的 ValidationResult

但是 IValidatableObject 的 B 类验证错误不会显示,因为 B 类是 A 类的属性

如何显示 B 类非属性验证错误?

最佳答案

我认为这很简单,让我用一个例子来解释。首先让我创建您面临的问题,然后我将解释如何解决。

1) 声明我的模型。

public class ClassA
{
[Required]
public string Name { get; set; }
public ClassB CBProp { get; set; }
}

public class ClassB:IValidatableObject
{
[Required]
public string MyProperty { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!string.IsNullOrWhiteSpace(MyProperty) && MyProperty.Length > 10)
yield return new ValidationResult("MaxLength reached");
}
}

2) 声明简单的 Action 。

public class HomeController : Controller
{
[HttpGet]
public ActionResult Test()
{
ClassA ca = new ClassA();
return View(ca);
}

[HttpPost]
public ActionResult Test(ClassA ca)
{
return View(ca);
}
}

3) 让我为 ClassB 创建一个简单的 View 和一个编辑器模板。

测试 View :

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>ClassA</legend>

<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
@Html.EditorFor(m => m.CBProp, "TestB")
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

编辑器模板

<div class="editor-label">
@Html.LabelFor(model => model.MyProperty)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MyProperty)
@Html.ValidationMessageFor(model => model.MyProperty)
</div>

4) 现在 View 看起来像,

enter image description here

5) 现在,如果我们单击“提交”。无需输入任何数据。它将按预期显示属性验证错误。

enter image description here

6) 现在如果我们在 MyProperty 中输入一个长度 > 10 的字符串,它应该显示错误消息“达到最大长度”,但不会显示错误 :) :)

enter image description here

这样做的原因

所以,如果我们查看 View 的代码,我们可以找到这一行

 @Html.ValidationSummary(true)  /// true, will excludePropertyErrors

由于 CBProp 是 ClassA 中的一个属性,ValidationSummary(true) 将排除 CBProp 中的任何错误。因此您不会发现正在显示的错误消息。然而,为此有多种选择。

选项

1) 设置@Html.ValidationSummary()

这将显示错误消息,但它也会显示任何其他错误消息(这是多余的),例如,

enter image description here

2) 在编辑器模板中设置@Html.ValidationSummary(true)。但它会显示错误消息,如

enter image description here

3) 在ClassB的Validate方法中,在ValidationResult中指定属性名称和错误消息。现在它将被视为该属性的验证错误,并将显示在@Html.ValidationMessageFor(model => model .MyProperty) 在编辑器模板中。

代码

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!string.IsNullOrWhiteSpace(MyProperty) && MyProperty.Length > 10)
yield return new ValidationResult("MaxLength reached", new List<string> { "MyProperty" });
}

错误看起来像

enter image description here

我想我现在很清楚为什么没有显示错误消息,以及有哪些可用选项。由您决定最适合您的方法。

干杯

关于c# - mvc3 ValidationSummary 排除属性错误 IValidatableObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433023/

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