- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的模型(类 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 和一个编辑器模板。
@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 看起来像,
5) 现在,如果我们单击“提交”。无需输入任何数据。它将按预期显示属性验证错误。
6) 现在如果我们在 MyProperty 中输入一个长度 > 10 的字符串,它应该显示错误消息“达到最大长度”,但不会显示错误 :) :)
所以,如果我们查看 View 的代码,我们可以找到这一行
@Html.ValidationSummary(true) /// true, will excludePropertyErrors
由于 CBProp 是 ClassA 中的一个属性,ValidationSummary(true)
将排除 CBProp 中的任何错误。因此您不会发现正在显示的错误消息。然而,为此有多种选择。
1) 设置@Html.ValidationSummary()
这将显示错误消息,但它也会显示任何其他错误消息(这是多余的),例如,
2) 在编辑器模板中设置@Html.ValidationSummary(true)
。但它会显示错误消息,如
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" });
}
我想我现在很清楚为什么没有显示错误消息,以及有哪些可用选项。由您决定最适合您的方法。
干杯
关于c# - mvc3 ValidationSummary 排除属性错误 IValidatableObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433023/
我有一个带有 Entity Framework 对象的模型。 EF 对象实现 IValidatableObject 并在其上具有 Validate() 方法。 由于某种原因,该方法运行了两次,所以我的
我了解 IValidatableObject 用于以一种让人们相互比较属性的方式验证对象。 我仍然希望有属性来验证单个属性,但我想在某些情况下忽略某些属性的失败。 在下面的案例中,我是否试图错误地使用
目前我的业务对象实现IDataErrorInfo .由于我打算在 ASP.NET MVC 3 中使用这些库,我认为我应该实现 IValidatableObject也可以代替。 WPF 是否与 IVal
您好,我正在尝试在 ASPNET MVC 4 项目上实现 IValidableObject 接口(interface)。我的模型位于不同的程序集中,当框架执行我的验证方法时,它没有显示validati
我使用数据注释来验证我的 Web API 2 模型。对于基本的基于属性的验证(Required、Range 等),通过注入(inject)自定义 ModelMetadataProvider 可以很容易
我正在尝试使用注释和一些自定义代码来验证嵌套对象(不是 MVC 中的模型)。 我发现以下帖子很有用 Using Data Annotations Validation Manually and Obj
在我的模型中,似乎 Validate()仅在两个属性都通过验证后调用。 public class MyModel : IValidatableObject { [Required] p
我的 Validate方法是访问各种服务进行验证。这些服务是依赖注入(inject)的,可以使用 validationContext.GetService 访问。方法。在运行时,这工作正常。 publ
所以我有以下对象 public class Person : IValidatableObject { [Required] public string Name {get;set;} [Requir
我找不到这方面的任何详细信息,但我遇到的问题是,如果对任何子属性的验证调用失败,则不会调用父对象的验证函数。下面的简单场景: public class Child : IValidateObject
在我的 ASP.NET MVC 3 项目中,我在一个单独的类库项目中实现了存储库模式。 我还使用 EF 作为 ORM。我还使用 IValidatableObejct 接口(interface)实现了一
我正在关注 ScottGus 博客 here - 我的基本要求是我在屏幕上有两个文本字段 - 我想验证它们是否都是空白的并且按下了 Sumite 按钮我想显示以使用那个或另一个是必需的 我有一个用户模
我有一个简单的问题(或没有)。 为什么当我验证我的对象时,下面的代码每次验证一个部分。 如果 DataAnnotations 失败,则不会调用 IValidatableObject 的验证。如果 Da
我的模型(类 A)有一个 B 类型的属性(称为 b),实现了 IValidatableObject。 View 有 @Html.ValidationSummary(true) 在验证摘要中,我想排除与
我想问一下我对可移植类库的疑问。我正在开发一个 DAL 层,我正在为我的业务对象使用 Portable 项目,该项目针对 .Net Framework 4.03 及更高版本,SilverLight 4
我试图让 EF 4.1 与 Repository、UnitOfWork、EF 实体分离和验证一起工作。 我关注了this将我的 POCO 实体与 EF 模型很好分离的指南,我现在正在关注 this实现
我有一个 ViewModel,它有一些 DataAnnotations 验证,然后为了更复杂的验证实现 IValidatableObject 并使用 Validate 方法。 我期待的行为是 this
默认情况下,EF 在生成对象时使用 EntityObject。我已经修改它以使用我自己的 AbstractEntityObject 类。这样做时,我添加了 IValidatableObject,因为当
我习惯于使用实体对象,现在我转向 DDD 原则,所以我将开始使用域对象。 我习惯用 RequiredAttribute 或 StringLengthAttribute 等属性来装饰我的实体对象的属性。
在这种情况下是否可以使用某种强类型方式(lambda?)指定字段名称: public class Demo : IValidatableObject { public string DemoF
我是一名优秀的程序员,十分优秀!