通常,类成员的ModelBinding验证可能就像这个例子一样:
public Class someclass
{
[StringLength(50)]
public string SomeValue { get; set; }
}
SomeValue最多限制为50个字符。
是否可以在运行时将常量(50)更改为其他内容,例如,在构造该类的每个实例期间,以便可以使用具有不同StringLength限制的不同实例?
如果是这样,那怎么做?
答案 0 :(得分:12)
是。但唯一的方法是创建自己的DataAnnotationsModelValidatorProvider实现,然后在Global.ascx.cs中注册它。你不能简单地在运行时删除属性但是中断读取它们的MVC内部:
public class ConventionModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
List<Attribute> newAttributes = new List<Attribute>(attributes);
if( mycondition == true )
{
//get rid of the existing attribute
newAttributes.Remove(newAttributes.OfType<StringLengthAttribute>().First());
//add a new one
newAttributes.Add( new StringLengthAttribute(5324));
}
return base.GetValidators(metadata, context, newAttributes);
}
}
注册:
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add( new CustomValidatorProvider() );