解决方法
MVC有一个钩子提供自己的ModelValidatorProvider。默认情况下,MVC 2使用ModelValidatorProvider的子类,名为DataAnnotationsModelValidatorProvider,它能够使用System.DataAnnotations.ComponentModel.ValidationAttribute属性进行验证。
DataAnnotationsModelValidatorProvider使用反射查找所有的ValidationAttributes,并简单循环通过集合验证您的模型。所有你需要做的是重写一个名为GetValidators的方法,并从你选择的任何源注入你自己的属性。我使用这种技术进行约定验证,具有DataType.Email属性的属性总是通过正则表达式传递,并使用此技术从数据库中提取信息,以便为“非强力”用户应用更多限制性验证。
以下示例简单说明“始终使任何FirstName属性都必需”:
public class CustomMetadataValidationProvider : DataAnnotationsModelValidatorProvider { protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata Metadata,ControllerContext context,IEnumerable<Attribute> attributes) { //go to db if you want //var repository = ((MyBaseController) context.Controller).RepositorySomething; //find user if you need it var user = context.HttpContext.User; if (!string.IsNullOrWhiteSpace(Metadata.PropertyName) && Metadata.PropertyName == "FirstName") attributes = new List<Attribute>() {new requiredAttribute()}; return base.GetValidators(Metadata,context,attributes); } }
所有你需要做的是在Global.asax.cs文件中注册提供程序:
protected void Application_Start() { ModelValidatorProviders.Providers.Add(new CustomMetadataValidationProvider()); AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); }
最终结果:
与此型号:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public DateTime Birthday { get; set; } }