asp.net-mvc - 相同的 DataAnnotation 属性在相同的属性上重复

标签 asp.net-mvc asp.net-mvc-3 data-annotations

我正在处理一些非常疯狂的自定义验证。基本上,根据下拉列表的选择,这将确定针对目标属性验证的值。

例如,我有以下下拉列表:

1 = Car
2 = Truck



在我的自定义验证中,如果选择的是汽车,则值不能超过 20。如果选择的是卡车,则值不能超过 40。

所以我的属性需要看起来像这样:
[ValueBelowIf("1", 20)]
[ValueBelowIf("2", 40)]
public int Value { get; set; }

当然,为了让它编译,我必须在我的自定义属性上设置它:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class ValueBelowIfAttribute : ValidationAttribute, IClientValidatable

但是,似乎只有第一个属性被绑定(bind)——第二个被忽略了。

我究竟做错了什么?

最佳答案

您需要覆盖 TypeId 的默认实现. MVC 的验证器将仅根据其 TypeId 值评估每个唯一属性。

将您的属性实现更改为以下内容,它将起作用:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class ValueBelowIfAttribute : ValidationAttribute, IClientValidatable
{
  private object _typeId = new object();
  public override object TypeId
  {
    get { return this._typeId; }
  }
  // OTHER CODE
}

据我所知,AllowMultiple,至少在 MVC 的情况下,只是告诉编译器该属性多次出现是有效的,但是 TypeId 控制了在运行时如何评估这些属性。

这很有用,因为您可以静态地(在编译时)允许多次应用相同的属性类型,但在运行时忽略逻辑上重复的属性。例如,在我的示例中,我可以返回属性参数的哈希码,而不是返回保证唯一的新对象()。在这种情况下,如果您这样做了:
[ValueBelowIf("1", 20)]
[ValueBelowIf("2", 40)]
[ValueBelowIf("2", 40)]
public int Value { get; set; }

第二个[ValueBelowIf("2", 40)]不会被评估。

在我在这里找到答案的地方阅读更多详细信息:
http://www.paraesthesia.com/archive/2010/03/02/the-importance-of-typeid-in-asp.net-mvc-dataannotations-validation-attributes.aspx

关于asp.net-mvc - 相同的 DataAnnotation 属性在相同的属性上重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015207/

相关文章:

ASP.net MVC 站点 : Redirect all "non WWW" request to WWW

asp.net - System.Web.Webpages.Html 与 System.Web.Mvc 命名空间中的 HtmlHelper 类

c# - ASP.Net MVC 3 登录和 Windows 身份验证

c# - 范围数据注释不起作用

c# - 使用 DisplayFormat 注释限制为 url 显示的长度?

asp.net - IgnoreRoute with webservice - 从路由中排除 asmx URL

javascript - 如何在 MVC C# 中将列表作为参数传递给 Controller

asp.net-mvc - 我在使用 asp.net-mvc 下拉列表时做错了什么?

c# - REngine rengine = REngine.CreateInstance ("RDotNet", new[] { "-q"} 在第二次调用时进一步停止执行

c# - 使用数据注释标记字段 "Read Only"