在代码中的StringLengthAttribute上设置MaximumLength

时间:2011-08-22 02:16:00

标签: c# asp.net-mvc-3 .net-4.0 attributes

我正在研究一些在viewmodels上使用DataAnnotation属性的代码,并在某些情况下以编程方式覆盖某些属性。

在各种类型的ErrorMessage上更改ValidationAttributes,没问题。

DataFormatString上更改DisplayFormatAttributes,没问题。

更改MinimumLength上的StringLengthAttribute,没问题。但是.. MaximumLength没有公共制定者!?

当这个属性公开时,有什么理由说这个属性有一个私有的二传手?我是否可以使用任何变通方法以编程方式更改StringLengthAttribute的最大长度?

3 个答案:

答案 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!!");
    }
}