【问题标题】:How to define resource type of validation attribute just once per assembly?如何为每个程序集定义一次验证属性的资源类型?
【发布时间】:2011-11-30 07:38:48
【问题描述】:

目前我正在设置我的域模型以使用 DataAnnotation 验证属性,例如 RequiredAttribute 和 RangeAttribute。

对于一个属性,它看起来像这样:

  [Required(ErrorMessageResourceType = typeof(ModelValidationMessages), ErrorMessageResourceName = "SurnameRequiredMessage")]
  public string Surname { get; set; }

然而,这不是唯一的属性,更不用说唯一的模型类了。但是,验证消息仅在整个程序集的 ErrorMessageResourceType 资源类中列出。

问题:

  • 是否可以为整个类定义 ErrorMessageResourceType 属性?
  • 是否可以为整个程序集定义 ErrorMessageResourceType 属性?
  • 如果没有,还有其他方法吗?

提前致谢!

【问题讨论】:

    标签: c# .net wpf asp.net-mvc data-annotations


    【解决方案1】:

    你可以写一个自定义的DataAnnotationsModelValidator:

    public class GlobalResourceTypeResourceDataAnnotationsModelValidator : DataAnnotationsModelValidator<ValidationAttribute>
    {
        public GlobalResourceTypeResourceDataAnnotationsModelValidator(
            ModelMetadata metadata, 
            ControllerContext context, 
            ValidationAttribute attribute
        )
            : base(metadata, context, attribute)
        {
            if (Attribute.ErrorMessageResourceType == null)
            {
                Attribute.ErrorMessageResourceType = typeof(ModelValidationMessages);
            }
        }
    }
    

    然后在 Application_Start 中你需要为你使用的每个属性注册一个适配器:

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredAttribute), typeof(GlobalResourceTypeResourceDataAnnotationsModelValidator));
    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthAttribute), typeof(GlobalResourceTypeResourceDataAnnotationsModelValidator));
    ...
    

    【讨论】:

    • 很好的解决方案,不知道它的存在。一个额外的问题;对于 WPF 应用程序,这个解决方案是否也可以实现?谢谢!
    • 现在设置资源类型,但是我怎么知道所有资源文件的消息键?比如“不能为空”、“必须是数字”
    猜你喜欢
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多