加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 18:52:08 所属栏目:asp.Net 来源:网络整理
导读:显然,可以在运行时动态地将DataAnnotation属性附加到对象属性,从而实现动态验证。 有人可以在这里提供代码示例吗? 解决方法 MVC有一个钩子提供自己的ModelValidatorProvider。默认情况下,MVC 2使用ModelValidatorProvider的子类,名为DataAnnotationsMod
显然,可以在运行时动态地将DataAnnotation属性附加到对象属性,从而实现动态验证。

有人可以在这里提供代码示例吗?

解决方法

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; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读