如何更改MVC 2.0中的数据注释验证的错误消息属性

时间:2010-04-12 05:47:05

标签: asp.net-mvc-2

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

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

通过重写DataAnnotationsModelValidatorProvider来看似乎是一项简单的任务 protected override IEnumerable GetValidators(ModelMetadata metadata,ControllerContext context,IEnumerable attributes)

然而,这似乎很复杂。

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

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

        //......
    }
}

有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

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

仔细考虑这一点,因为您正在走向一条混淆应用程序实际发生情况的路径。当然数据库信息很有用,但它实际上并不是验证的一部分,也不应该是。

当你朝这个方向前进时,你基本上是说如果存在数据库问题,验证只能是无效的。我看到两个问题:

  1. 打破了关注点的分离。您正在报告模型中的持久性错误,而不是它发生的位置。
  2. 解决方案不是单元可测试的,因为您必须使用数据库。
  3. 我不喜欢上述两种情况中的任何一种。

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

    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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

另外,您可能需要查看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类。