设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间21 现在时间21 缓存数据 青春之所以让人留念,是因为我们年轻时干的蠢事大都妙不可言。晚安!

青春之所以让人留念,是因为我们年轻时干的蠢事大都妙不可言。晚安!

查看: 947|回复: 0

ASP.NET Core 模型验证消息的本地化新姿势详解

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
34
主题
24
精华
0
金钱
93
积分
60
注册时间
2023-10-3
最后登录
2025-6-1

发表于 2025-6-1 05:32:02 | 显示全部楼层 |阅读模式

最近在研究系统本地化的问题,不可避免要实现模型类的验证消息本地化。毕竟这些错误消息是要返回给用户的。

疑问产生

在MVC模型下,我们会使用模型类对请求参数进行绑定和验证。举个例子:

  1. public class UserDto
  2. {
  3. [Required(ErrorMessage = "姓名不能为空")]
  4. public string Name{get; set;}
  5. [Required(ErrorMessage = "年龄不能为空")]
  6. [Range(1, 120, ErrorMessage = "年龄必须在1到120之间")]
  7. public int? Age {get; set; }
  8. }
复制代码

这样本身没有什么问题,但如果有大量模型要做本地化改造,那可就是个大工程了。

我们不禁要问,为什么要指定ErrorMessage,默认的错误消息不能用吗?毕竟我们人工指定的错误消息除了字段名之外,其它都完全一样,实在没有必要逐个指定。

默认消息

我们来改造一下看看,删除掉指定的ErrorMessage。

  1. public class UserDto
  2. {
  3. [Required]
  4. public string Name{get; set;}
  5. [Required]
  6. [Range(1, 120)]
  7. public int? Age {get; set; }
  8. }
复制代码

如果没有传入参数导致验证不通过,会得到如下消息:

  1. "The Name field is required.""The Age field is required."
复制代码

没错,默认消息是英文的,这对我们来说完全不可用——这对用户很不友好,难怪要人工设置ErrorMessage。

查找默认消息

那有没有可能直接把默认消息本地化呢?如果可以,那就不用再麻烦地设置ErrorMessage了。

通过查看官方源码我们发现,默认消息来自SR类,以RequiredAttribute举例:

  1. public RequiredAttribute()
  2. : base(() => SR.RequiredAttribute_ValidationError)
  3. {
  4. }
复制代码

SR类的内容简略如下:

  1. internal static partial class SR
  2. {
  3. internal static global::System.Resources.ResourceManager ResourceManager => s_resourceManager ?? (s_resourceManager = new global::System.Resources.ResourceManager(typeof(FxResources.System.ComponentModel.Annotations.SR)));
  4. internal static string @RequiredAttribute_ValidationError => GetResourceString("RequiredAttribute_ValidationError", @"The {0} field is required.");
  5. }
复制代码

上面的代码中,GetResourceString最终会调用内部声明的ResourceManager。而 ResourceManager会根据传入的类型参数查找本地化资源。

本地化默认消息

通过上面的分析,如果要使用中文内容,我们只要把本地化的消息放入FxResources.System.ComponentModel.Annotations.SR.zh-CN.resources 即可。动手之前,我们再确认一下。

ILSpy 打开 System.ComponentModel.Annotations.dll,确实可以看到默认的资源FxResources.System.ComponentModel.Annotations.SR.resources,证明我们的分析没错。

1.png

默认(中立语言)资源里面包含了错误消息,也包含了内部的异常消息。我们可以全部或者选择地本地化它们。

2.png

建立语言扩展包

我们建立一个项目,名为 FxResources.System.ComponentModel.Annotations。根据默认规则,在项目中建立的资源会自动添加命名空间作为前缀。

因此我们只需要再创建名为 SR的资源即可。

3.png

如图,我们建立了对应的中文简体和中文繁体资源,这样就大功告成了!

4.png

说明:zh-Hans兼容zh-CN、zh-SG;zh-Hant兼容zh-TW、zh-MO、zh-HK。严格讲港澳台繁体略有差异,但在一般场景可以忽略。

最终效果

同样是之前的例子,我们不需要再指定ErrorMessage。

  1. public class UserDto
  2. {
  3. [Required]
  4. public string Name{get; set;}
  5. [Required]
  6. [Range(1, 120)]
  7. public int? Age {get; set; }
  8. }
复制代码

现在我们得到的消息是这样,看起来还不错。

  1. "Name 字段为必填项。""Age 字段为必填项。"
复制代码

注意:如果你的项目没有启用国际化功能,你需要设置默认的文化为中文:CultureInfo.DefaultThreadUICulture = CultureInfo.GetCultureInfo("zh-Hans")

Nuget包

为方便大家使用,已经将语言资源打包为语言包,大家直接安装到项目即可。

  1. Install-Package FxResources.System.ComponentModel.Annotations.zh-Hans -Version 9.0.0
复制代码

.NET 不同版本的资源之间有略微差异,大家选择对应的版本安装即可。

到此这篇关于ASP.NET Core 模型验证消息的本地化新姿势的文章就介绍到这了,更多相关ASP.NET Core 模型验证消息内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表