【问题标题】:How to change ErrorMessage property of the DataAnnotation validation in MVC2.0如何更改 MVC2.0 中 DataAnnotation 验证的 ErrorMessage 属性
【发布时间】:2010-04-12 05:47:05
【问题描述】:

我的任务是更改 MVC2.0 中 DataAnnotation 验证属性的 ErrorMessage 属性。例如,我应该能够传递一个 ID 而不是 Model 属性的实际错误消息,并使用该 ID 从另一个服务(例如数据库)检索一些内容(错误消息),并在视图中显示该错误消息而不是ID。为此,我需要设置 DataAnnotation 验证属性的 ErrorMessage 属性。

    [StringLength(2, ErrorMessage = "EmailContentID.")]
    [DataType(DataType.EmailAddress)]        
    public string Email { get; set; }

只需重写 DataAnnotationsModelValidatorProvider 似乎是一项简单的任务 protected override IEnumerable GetValidators(ModelMetadata 元数据,ControllerContext 上下文,IEnumerable 属性)

不过好像已经够复杂了。

一个。 MVC DataannotationsModelValidator 的 ErrorMessage 属性是只读的。所以我不能在这里设置任何东西 湾。 System.ComponentModel.DataAnnotationErrorMessage 属性(获取和设置)已在 MVC DataannotationsModelValidator 中设置,因此我们无法再次设置。如果您尝试设置,则会出现“该属性不能设置多次...”错误消息。

public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider
{
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {
        IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes);

        foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>())
        {
            messageId = validator.ErrorMessage;
            validator.ErrorMessage = "Error string from DB And" + messageId ;
        }

        //......
    }
}

谁能帮我解决这个问题?

【问题讨论】:

    标签: asp.net-mvc-2


    【解决方案1】:

    问题是:您更改错误消息属性的动机是什么?

    仔细考虑这一点,因为您正朝着混淆应用程序中实际发生的事情的方向前进。当然,数据库信息是有用的,但它不是验证的一部分,也不应该是。

    当您朝这个方向前进时,您实质上是在说只有在存在数据库问题时验证才能无效。我发现这有两个问题:

    1. 它打破了关注点的分离。您在模型中报告了一个持久性错误,这不是它发生的地方。
    2. 该解决方案不可单元测试,因为您必须使用数据库。

    以上两种我都不喜欢。

    你能解决这个问题吗?可能如果您将创建自己的自定义验证属性。我必须检查并确保这是正确的。另一种选择是针对自定义验证:

    http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

    这篇文章也可以帮助你朝着你想要的方向前进:

    http://ryanrivest.com/blog/archive/2010/01/15/reusable-validation-error-message-resource-strings-for-dataannotations.aspx

    你想解决这个问题吗?如果您试图在应用程序中保持适当的关注点分离,则并非如此。我不会用数据库错误(我无效,但数据库也炸毁)来污染我的验证错误消息(这是无效的)。只是我的两分钱。

    【讨论】:

      【解决方案2】:

      有一些内置方法可以通过资源获取错误消息。不是在运行时通过数据库查找来获取资源,而是从数据库生成资源并将其用于错误消息。

      然后您可以使用ErrorMessageResourceNameErrorMessageResourceType 来允许DataAnnotation 执行资源查找,而不是硬编码特定的字符串。

      public sealed class MyModel
      {
          [Required(
              ErrorMessageResourceName="MyDescriptionResource",
              ErrorMessageResourceType=typeof(MyCustomResource))]
          public string Description { get; set; }
      }
      

      【讨论】:

        【解决方案3】:

        您可能还想查看 msdn 上的 ValidationAttribute.FormatErrorMessage Method

        此方法格式化错误消息 通过使用 ErrorMessageString 财产。此方法附加名称 触发的数据字段 格式化错误消息的错误。 您可以自定义错误的方式 消息通过创建一个格式化 覆盖这个的派生类 方法。

        一个简单的例子(并不意味着是一个明确的例子)

        [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, 
                        Inherited = true)]
        public sealed class PostCodeValidationAttribute
            : ValidationAttribute
        {
            public override bool IsValid(object value)
            {
                if( value == null )
                    return true;
        
                string postCode = value as string;
                if( string.IsNullOrEmpty(postCode) )
                    return true;
        
                if ( !PostCode.IsValidPostCode(postCode, this.PostCodeStyle) )
                    return false;
        
                return true;
            }
        
            public PostCodeStyle PostCodeStyle { get; set; } 
        
            public override string FormatErrorMessage(string name)
            {
                return string.Format(
                    "{0} is not a valid postcode for {1}", name, PostCodeStyle);
            }
        }
        

        * 我省略了 PostCodeStyle 枚举以及用于验证邮政编码的 PostCode 类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 2013-01-29
          • 1970-01-01
          • 2012-03-21
          • 1970-01-01
          相关资源
          最近更新 更多