全局覆盖ASP.Net MVC默认属性错误消息

时间:2014-08-01 16:00:18

标签: c# asp.net asp.net-mvc unobtrusive-validation

如何使用其他程序集中的资源覆盖MVC5应用程序中的默认属性错误消息?

我的网站是命名空间:Company.Web

我的资源程序集是命名空间:Company.Web.Resources

我可以使用以下方法单独本地化属性错误消息:

[Required(ErrorMessageResourceName = "PropertyValueRequired", ErrorMessageResourceType = typeof(Company.Web.Resources.Messages))]

但是,由于我们的错误消息总是"必需",我只想放置[Required]属性而不必指定资源名称。我还想覆盖MVC输出的默认数据类型消息,你不能通过属性来做。

  

字段{0}必须是日期。

我想成为

  

日期无效

我已经看过一些示例,您可以将资源文件放在App_GlobalResources中(使用键PropertyValueRequiredFieldMustBeDateFieldMustBeNumeric)并设置ClientDataTypeModelValidatorProvider.ResourceClassKey,但我已经有我想要使用的外部资源程序集。

我尝试在我的Global.asax中使用以下内容但没有运气:

ClientDataTypeModelValidatorProvider.ResourceClassKey = "Company.Web.Resources.Messages"

我怎样才能做到这一点?有什么想法吗?

更新(部分解决方案)

我可以简单地通过创建新的验证适配器并使用它们来代替默认值来解决基于属性的问题:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
    public MyRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    {
        if (attribute.ErrorMessage.IsNullOrWhitespace() 
            && attribute.ErrorMessageResourceName.IsNullOrWhitespace() 
            && attribute.ErrorMessageResourceType == null)
        {
            attribute.ErrorMessageResourceType = typeof (Resources.Validation.Messages);
            attribute.ErrorMessageResourceName = "PropertyValueRequired";
        }
    }
}

Global.asax中

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredAttribute), typeof(MyRequiredAttributeAdapter));

但是,这仍然让我不知道如何覆盖非null属性(如DateTime和int)的默认数据类型消息。此外,我相信有一些我无法覆盖,因为它们是内部的(DataTypeAttributeAdapter,CompareAttributeAdapter)。

1 个答案:

答案 0 :(得分:0)

这可能已经很晚了,但是这里的解决方案应该主要基于部分解决方案背后的逻辑。

  1. 为您的项目实施自定义RequiredAttribute

    public class MyRequiredAttribute : RequiredAttribute
    {
        //Your custom code
    }
    
  2. 修改您的MyRequiredAttributeAdapter代码,如图所示。请注意,您现在需要继承通用DataAnnotationsModelValidator类,这样您就可以传入自定义MyRequiredAttribute

    public class MyRequiredAttributeAdapter : DataAnnotationsModelValidator<MyRequiredAttribute>
    {
        public MyRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, MyRequiredAttribute attribute)
            : base(metadata, context, attribute)
        {
            if (string.IsNullOrWhiteSpace(attribute.ErrorMessage)
                && string.IsNullOrWhiteSpace(attribute.ErrorMessageResourceName)
                && attribute.ErrorMessageResourceType == null)
            {
                attribute.ErrorMessageResourceType = typeof(Resources.Validation.Messages);
                attribute.ErrorMessageResourceName = "PropertyValueRequired";
            }
        }
    }
    
  3. 将此添加到Global.asax(根据您在部分解决方案中的内容进行修改)

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MyRequiredAttribute), typeof(MyRequiredAttributeAdapter));