我正在研究一些在viewmodels上使用DataAnnotation属性的代码,并在某些情况下以编程方式覆盖某些属性。
在各种类型的ErrorMessage
上更改ValidationAttributes
,没问题。
在DataFormatString
上更改DisplayFormatAttributes
,没问题。
更改MinimumLength
上的StringLengthAttribute
,没问题。但是.. MaximumLength
没有公共制定者!?
当这个属性公开时,有什么理由说这个属性有一个私有的二传手?我是否可以使用任何变通方法以编程方式更改StringLengthAttribute
的最大长度?
答案 0 :(得分:3)
由于设置MaximumLength
属性的唯一公共方法是通过属性构造函数,因此在构造之后没有编程方式来更改它。假设您以足够的信任运行代码,您始终可以使用私有反射来执行您需要的操作。如果您不想(或不能)走这条路线,另一种选择是在给定条件下交换视图模型,而不是仅根据需要更新属性。然后,您可以为每个单独的视图模型构建所需的属性,而不必担心以编程方式更改属性本身。
最后一个选项是实际编写自己的StringLength
属性。您可以很容易地模仿内置版本的功能,因为它的IsValid()
方法非常简单:
public override bool IsValid(object value)
{
int num = (value == null) ? 0 : ((string)value).Length;
return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}
模仿,但在public
属性中包含MaximumLength
setter可以为您提供所需的信息。
答案 1 :(得分:1)
假设您正在使用自定义的ModelMetadataValidatorProvider,正如我在How to add validation attribute to model property in TemplateEditor in MVC3中所概述的那样,在重写GetValidators方法时,您可以遍历base方法返回的验证器,删除当前的StringLengthAttribute,并替换您的StringLengthAttribute,需要MaxLength值。
答案 2 :(得分:0)
由于此代码特定于viewmodel,因此您的ViewModel实现了IValidateableObject接口并在那里进行验证。
public IEnumerable Validate(ValidationContext validationContext)
{
if (YourField.Length == 2)
{
yield return new ValidationResult("ut oh!!");
}
}