gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:02:26 25 4
gpt4 key购买 nike

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

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

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/

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