C# 在代码中设置StringLength属性的最大长度

C# 在代码中设置StringLength属性的最大长度,c#,asp.net-mvc-3,.net-4.0,attributes,C#,Asp.net Mvc 3,.net 4.0,Attributes,我正在编写一些代码,这些代码在viewmodels上使用DataAnnotation属性,并在某些情况下以编程方式重写某些属性 在各种类型的验证属性上更改错误消息,没有问题 更改DisplayFormatAttributes上的DataFormatString,没有问题 在StringLengthAttribute上更改MinimumLength,没有问题。但是最大长度没有公共设置器 有什么原因可以解释为什么这一家酒店周围都是公共的,却有一个私人的setter?是否有任何变通方法可用于以编程方式

我正在编写一些代码,这些代码在viewmodels上使用DataAnnotation属性,并在某些情况下以编程方式重写某些属性

在各种类型的
验证属性上更改
错误消息
,没有问题

更改
DisplayFormatAttributes
上的
DataFormatString
,没有问题

StringLengthAttribute
上更改
MinimumLength
,没有问题。但是<代码>最大长度
没有公共设置器


有什么原因可以解释为什么这一家酒店周围都是公共的,却有一个私人的setter?是否有任何变通方法可用于以编程方式更改
StringLengthAttribute
的最大长度?

由于设置
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 override bool有效(对象值)
{
int num=(值==null)?0:((字符串)值).Length;

返回值==null | |(num>=this.MinimumLength&&num假设您使用的是自定义ModelMetadataValidatorProvider,如我在中所述,在重写GetValidators方法时,您可以迭代基本方法返回的验证器,删除当前StringLengthAttribute,并用MaxLength值替换StringLengthAttribute需要。

由于此代码是特定于viewmodel的,因此请让您的viewmodel实现IValidTeableObject接口并在其中进行验证


public IEnumerable Validate(ValidationContext validationContext)
{
    if (YourField.Length == 2)
    {
        yield return new ValidationResult("ut oh!!");
    }
}

我尝试了这个想法,在我的自定义模型MetadataValidatorProvider中,我可以检索
StringLengthatTributeAdapterAdapter
,但是它的
属性
属性受到保护,因此我无法获取原始属性的最小长度和错误消息,以构建具有不同最大长度的新属性。感谢您的回答-然而,我最终实现了自己的自定义验证属性,我们称之为
MyStringLengthAttribute
,它的功能与框架属性相同,只是有一个公共的
MaximumLength
属性。现在一切正常。