asp.net-mvc – DataAnnotations动态附加属性

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – DataAnnotations动态附加属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
显然,可以在运行时动态地将DataAnnotation属性附加到对象属性,从而实现动态验证。 @H_403_2@有人可以在这里提供代码示例吗?

解决方法

MVC有一个钩子提供自己的ModelValidatorProvider。默认情况下,MVC 2使用ModelValidatorProvider的子类,名为DataAnnotationsModelValidatorProvider,它能够使用System.DataAnnotations.ComponentModel.ValidationAttribute属性进行验证。 @H_403_2@DataAnnotationsModelValidatorProvider使用反射查找所有的ValidationAttributes,并简单循环通过集合验证您的模型。所有你需要做的是重写一个名为GetValidators的方法,并从你选择的任何源注入你自己的属性。我使用这种技术进行约定验证,具有DataType.Email属性属性总是通过正则表达式传递,并使用此技术从数据库提取信息,以便为“非强力”用户应用更多限制性验证。

@H_403_2@以下示例简单说明“始终使任何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);
    }
}
@H_403_2@所有你需要做的是在Global.asax.cs文件注册提供程序:

protected void Application_Start()
    {
        ModelValidatorProviders.Providers.Add(new CustomMetadataValidationProvider());

        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }
@H_403_2@最终结果:

@H_403_2@与此型号:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Birthday { get; set; }
}

猜你在找的asp.Net相关文章