ASP.NET MVC中数据注释的默认资源

Kim*_*jan 18 .net asp.net-mvc-2-validation data-annotations asp.net-mvc-2

有一种方法可以将默认资源设置为数据注释验证吗?

我不想做这样的事情:

[Required(ErrorMessage="Name required.", ErrorMessageResourceType=typeof(CustomDataAnnotationsResources)]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

Global.asax中

DataAnnotations.DefaultResources = typeof(CustomDataAnnotationsResources);
Run Code Online (Sandbox Code Playgroud)

然后

[Required]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

有人给我一个光!

提前致谢

编辑

我真正的问题是使用EF Code First CTP4.CTP5修复它.谢谢大家.

CGK*_*CGK 13

你可以尝试这样做:

在项目的某处添加此类:

 public class ExternalResourceDataAnnotationsValidator : DataAnnotationsModelValidator<ValidationAttribute>
{
    /// <summary>
    /// The type of the resource which holds the error messqages
    /// </summary>
    public static Type ResourceType { get; set; }

    /// <summary>
    /// Function to get the ErrorMessageResourceName from the Attribute
    /// </summary>
    public static Func<ValidationAttribute, string> ResourceNameFunc 
    {
        get { return _resourceNameFunc; }
        set { _resourceNameFunc = value; }
    }
    private static Func<ValidationAttribute, string> _resourceNameFunc = attr => attr.GetType().Name;

    public ExternalResourceDataAnnotationsValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute)
        : base(metadata, context, attribute)
    {
        if (Attribute.ErrorMessageResourceType == null)
        {
            this.Attribute.ErrorMessageResourceType = ResourceType;
        }

        if (Attribute.ErrorMessageResourceName == null)
        {
            this.Attribute.ErrorMessageResourceName = ResourceNameFunc(this.Attribute);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在您的global.asax中,添加以下内容:

// Add once
ExternalResourceDataAnnotationsValidator.ResourceType = typeof(CustomDataAnnotationsResources);

// Add one line for every attribute you want their ErrorMessageResourceType replaced.
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RangeAttribute), typeof(ExternalResourceDataAnnotationsValidator));
Run Code Online (Sandbox Code Playgroud)

它将查找与错误消息的验证程序类型同名的属性.您可以通过ResourceNameFunc属性更改它.

编辑:AFAIK从MVC2开始,因为DataAnnotationsModelValidatorProvider是在MVC2中引入的.


Joh*_*ika 12

为此,我创建了一个继承自RequiredAttribute的新类,并将错误消息嵌入到这个新类中:

public class RequiredWithMessageAttribute : RequiredAttribute
{
    public RequiredWithMessageAttribute()
    {
        ErrorMessageResourceType = typeof(ValidationResource);
        ErrorMessageResourceName = "RequiredErrorMessage";
    }
}
Run Code Online (Sandbox Code Playgroud)

错误消息来自ValidationResource.resx文件,我在其中列出错误消息,如下所示:

RequiredErrorMessage - >"{0}是必需的."

其中{0} =显示名称.

然后我像这样注释我的模型,所以我永远不必重复我的错误消息声明:

[RequiredWithMessage]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

执行此操作后,只要验证失败,就会出现错误消息("名称是必需的.").

这适用于ASP.NET MVC的服务器端验证和客户端验证.