C# 在代码中设置StringLength属性的最大长度
我正在编写一些代码,这些代码在viewmodels上使用DataAnnotation属性,并在某些情况下以编程方式重写某些属性 在各种类型的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?是否有任何变通方法可用于以编程方式
验证属性上更改错误消息
,没有问题
更改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
属性。现在一切正常。