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

本文关键字:属性 错误 消息 默认 MVC 覆盖 ASP Net 全局 | 更新日期: 2023-09-27 18:16:04

如何使用来自不同程序集的资源来覆盖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));

然而,这仍然让我难以理解如何覆盖DateTime和int等非null属性的默认数据类型消息。此外,我相信还有一些我无法覆盖,因为它们是内部的(DataTypeAttributeAdapter、CompareAttributeAdapter(。

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

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

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

要覆盖DateTime和int等非null属性的默认数据类型消息,
基于MVC ClientDataTypeModelValidatorProvider实现自己的CCD_
将该实例添加到ModelValidatorProviders.Providers,并删除默认实例。

所以,把这个放进Global.asax:

var clientDataTypeModelValidatorProviderIndex = ModelValidatorProviders.Providers.FindIndex(modelValidatorProvider => modelValidatorProvider is ClientDataTypeModelValidatorProvider);
ModelValidatorProviders.Providers.RemoveAt(clientDataTypeModelValidatorProviderIndex);
ModelValidatorProviders.Providers.Add(new MyClientDataTypeModelValidatorProvider());

使用MVC 5 进行测试