我正在处理一些非常疯狂的自定义验证。基本上,根据下拉列表的选择,这将确定针对目标属性验证的值。
例如,我有以下下拉列表:
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/