如何为验证属性提供本地化验证消息

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我工作的一个ASP.NET Core应用程序,我想重写数据的注解默认验证错误消息,如RequiredMinLengthMaxLength等我读的文档:https://docs.microsoft.com/en-us/aspnet/core /基础/本地化,似乎它不包括我在寻找...

例如,Required对于任何模型属性,属性的验证错误消息始终可以相同。默认文本只是声明:{0}字段是必需的,其中{0}占位符将填充属性的显示名称。

在我的视图模型中,我使用Required没有任何命名参数的属性,像这样......

class ViewModel
{
    [Required, MinLength(10)]
    public string RequiredProperty { get; set; }
}

在我看来,设置ErrorMessageErrorMessageResourceName(和ErrorMessageResourceType)是不必要的开销。我认为我可以实现一些类似的东西,IDisplayMetadataProvider允许我返回应用属性的错误消息,以防验证失败。那可能吗?

提问于
用户回答回答于

对于那些最终在这里寻找通用解决方案的人来说,解决它的最佳方法是使用验证元数据提供程序。我的解决方案基于这篇文章: AspNetCore MVC错误消息,我使用.net框架样式本地化,并简化它以使用设计的提供程序。

  1. 将一个资源文件(例如ValidationsMessages.resx)添加到项目中,并将Access Modifier设置为Internal或Public,以便生成后面的代码。
  2. 为每种语言ValidationsMessages添加自定义本地化es .resx。切记不要为此文件设置Access Modifier,代码在步骤1中创建。
  3. 添加IValidationMetadataProvider的实现
  4. 根据属性类型名称添加本地化,​​如“RequiredAtrribute”。
  5. 在启动文件上设置您的应用程序。

示例ValidationsMessages。es .resx

IValidatioMetadaProvider的样本:

using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
public class LocalizedValidationMetadataProvider : IValidationMetadataProvider
{
    public LocalizedValidationMetadataProvider()
    {
    }

    public void CreateValidationMetadata(ValidationMetadataProviderContext context)
    {
        if (context.Key.ModelType.GetTypeInfo().IsValueType && context.ValidationMetadata.ValidatorMetadata.Where(m => m.GetType() == typeof(RequiredAttribute)).Count() == 0)
            context.ValidationMetadata.ValidatorMetadata.Add(new RequiredAttribute());
        foreach (var attribute in context.ValidationMetadata.ValidatorMetadata)
        {
            var tAttr = attribute as ValidationAttribute;
            if (tAttr?.ErrorMessage == null && tAttr?.ErrorMessageResourceName == null)
            {
                var name = tAttr.GetType().Name;
                if (Resources.ValidationsMessages.ResourceManager.GetString(name) != null)
                {
                    tAttr.ErrorMessageResourceType = typeof(Resources.ValidationsMessages);
                    tAttr.ErrorMessageResourceName = name;
                    tAttr.ErrorMessage = null;
                }
            }
        }
    }
}

将提供程序添加到Startup类的ConfigureServices方法:

services.AddMvc(options =>
{
    var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
    var L = F.Create("ModelBindingMessages", "EnGuate");
     options.ModelMetadataDetailsProviders.Add(new LocalizedValidationMetadataProvider());
})

热门问答

急急急!!核验图片验证码填写到接入备案企业侧备案系统中,在哪操作啊?

无聊至极互联网重度用户
推荐
你反馈的上海备案的APP核验验证码吗?如果是的话,提交订单的时候直接写验证码就可以的。 在补充材料的下面 image.png ... 展开详请

存储桶和项目概念?

Hyman.W

腾讯云 · 高级产品经理 (已认证)

推荐
一个存储桶对应多个项目的管理方式,可以使用 “标签” 来管理, 在创建存储桶或者修改存储桶配置的页面可以添加。 参考: 1,存储桶标签使用 https://cloud.tencent.com/document/product/436/34830 2,如果需要通过外部系统来管理...... 展开详请

智能钛能处理大数据文件吗?我有30G的数据存储在本地电脑硬盘上?

腾讯智能钛AI开发者

腾讯云 · 智能钛产品团队 (已认证)

腾讯智能钛产品团队官方运营账号。分享产品最新动态,第一时间解答用户疑问。
推荐

硬盘可以升级吗?

最爱开车啦互联网的敏感者
推荐

可以升级,小微活动中没有云硬盘的的,后续可以用同帐号在官网购买和服务器同地域同地区的云硬盘挂载到服务器上使用。

云硬盘挂载初始化方法 可参考 https://cloud.tencent.com/document/product/362/6735

云通信 70402 错误?

推荐已采纳

参数非法,请检查必填字段是否填充,或者字段的填充是否满足协议要求。

您好,可参考此文档:https://cloud.tencent.com/document/product/269/1671

录音识别sdk的录音文件如何保存?

Richel码农
推荐

1.实时语音sdk内置录音器采集音频暂不支持保存语音数据,如需要保存语音数据建议上层自行采集音频数据。

2.实时语音识别sdk不支持暂停&继续操作,停止识别后重新调用start即开始识别。

所属标签

扫码关注云+社区

领取腾讯云代金券