首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
ASP NET Core 本地化模型验证消息完全指南

ASP NET Core 本地化模型验证消息完全指南

热心网友
29
转载
2026-05-07

在实现系统本地化的过程中,模型验证消息的本地化是一个绕不开的环节。毕竟,这些直接呈现给用户的错误信息,其友好性和准确性至关重要。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

疑问产生

在标准的MVC架构下,我们通常会利用数据注解(Data Annotations)来装饰模型类,以实现请求参数的绑定和验证。一个典型的例子是这样的:

public class UserDto
{
    [Required(ErrorMessage = "姓名不能为空")]
    public string Name{get; set;}

    [Required(ErrorMessage = "年龄不能为空")]
    [Range(1, 120, ErrorMessage = "年龄必须在1到120之间")]
    public int? Age {get; set;}
}

单从功能上看,这没有任何问题。然而,一旦面临大批量模型需要本地化改造的场景,问题就浮现了——这几乎是一项重复性的体力劳动。

这就引出了一个核心疑问:我们真的必须为每个属性手工指定ErrorMessage吗?那些框架提供的默认错误消息难道不能用?仔细想想,除了字段名不同,我们手动编写的提示信息在结构上几乎一模一样,这种重复劳动似乎并无必要。

默认消息

抱着这个疑问,我们尝试删掉所有自定义的ErrorMessage

public class UserDto
{
    [Required]
    public string Name{get; set;}

    [Required]
    [Range(1, 120)]
    public int? Age {get; set;}
}

运行验证,当参数缺失时,得到的消息是这样的:

"The Name field is required."

"The Age field is required."

没错,默认消息是英文的。这对中文用户显然不够友好,也解释了为什么之前我们不得不逐一进行手动设置。

查找默认消息

那么,有没有更彻底的办法?能否直接对框架的默认验证消息进行本地化?如果可以,岂不是一劳永逸,彻底告别手工设置ErrorMessage的烦恼?

顺着这个思路去翻阅官方源码,答案逐渐清晰。以RequiredAttribute为例,其默认错误消息来源于一个内部类SR

public RequiredAttribute()
      : base(() => SR.RequiredAttribute_ValidationError)
{
}

进一步查看SR类的简化结构:

internal static partial class SR
{
    internal static global::System.Resources.ResourceManager ResourceManager => s_resourceManager ?? (s_resourceManager = new global::System.Resources.ResourceManager(typeof(FxResources.System.ComponentModel.Annotations.SR)));

    internal static string @RequiredAttribute_ValidationError => GetResourceString("RequiredAttribute_ValidationError", @"The {0} field is required.");
}

这里的逻辑很明确:GetResourceString方法最终会调用内部声明的ResourceManager。而这个资源管理器,会根据运行时文化和传入的类型参数,去定位对应的本地化资源文件。

本地化默认消息

分析到这里,路径就非常清楚了。要实现中文默认消息,我们只需要将翻译好的文本,放入正确命名的资源文件FxResources.System.ComponentModel.Annotations.SR.zh-CN.resources中即可。

动手之前,最好再确认一下。使用ILSpy等工具打开System.ComponentModel.Annotations.dll,确实可以看到名为FxResources.System.ComponentModel.Annotations.SR.resources的默认(中立语言)资源,这印证了我们的分析是完全正确的。

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

默认资源文件中包含了所有验证属性(如Required、Range、StringLength等)的错误消息模板,也包括一些内部的异常消息。我们可以根据自己的需要,对其进行全部或选择性的本地化。

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

建立语言扩展包

理论可行,接下来就是实践。我们新建一个类库项目,命名为 FxResources.System.ComponentModel.Annotations。根据.NET的资源命名规则,项目中创建的资源文件会自动加上项目默认命名空间作为前缀。

因此,我们只需在项目中添加一个名为SR的资源文件(.resx)即可。

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

如图所示,我们分别创建了针对简体中文(zh-Hans)和繁体中文(zh-Hant)的资源文件,并填入对应的翻译内容。这样一来,核心工作就完成了。

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

这里有个细节需要说明:语言标记zh-Hans(简体中文)兼容zh-CNzh-SG等地区变体;zh-Hant(繁体中文)则兼容zh-TWzh-MOzh-HK。严格来说,港澳台地区的用词习惯略有差异,但在大多数通用场景下,使用统一的繁体中文资源已足够。

最终效果

现在,回到最初那个例子,我们不再需要指定任何ErrorMessage

public class UserDto
{
    [Required]
    public string Name{get; set;}

    [Required]
    [Range(1, 120)]
    public int? Age {get; set;}
}

当验证触发时,用户看到的将是地道的中文提示,效果立竿见影:

"Name 字段为必填项。"

"Age 字段为必填项。"

需要注意的是:如果你的项目尚未启用或配置完整的国际化(I18N)中间件,你可能需要在应用启动时显式设置默认的UI文化,例如:CultureInfo.DefaultThreadUICulture = CultureInfo.GetCultureInfo(“zh-Hans”),以确保资源查找机制能正确生效。

Nuget包

为了方便广大开发者直接使用,已经将制作好的中文简体语言资源打包并发布到了NuGet。只需在项目中执行以下命令即可安装:

Install-Package FxResources.System.ComponentModel.Annotations.zh-Hans -Version 9.0.0

由于不同版本的.NET框架中,验证消息的文本可能存在细微调整,因此语言包也对应不同的主版本。请大家根据自己项目使用的.NET版本,选择对应版本的语言包进行安装,以达到最佳兼容效果。

来源:https://www.jb51.net/aspnet/33818973r.htm
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

安全用电指南正确连接集线器电源的方法
电脑教程
安全用电指南正确连接集线器电源的方法

集线器插电源必须严格遵循“先断电、再接线、后上电”的安全闭环流程 这可不是什么多余的步骤,而是电气工程领域的硬性规定。其依据清清楚楚地写在IEEE 802 3以太网标准和各大主流设备厂商的技术文档里。具体来说,如果给集线器带电插拔RJ45网线,虽然不一定立刻“冒烟”,但极有可能冲击到PHY芯片,造成

热心网友
05.07
C++实现图的拓扑排序Kahn算法详解与BFS核心源码解析
编程语言
C++实现图的拓扑排序Kahn算法详解与BFS核心源码解析

拓扑排序失败是算法实现中常见的问题。代码逻辑看似正确,但运行时可能陷入停滞或输出序列不完整,无法得到有效的拓扑顺序。这通常是由于图中存在环路依赖,导致算法无法找到入度为零的起始节点,从而使整个排序流程中断。 具体是哪些环节容易导致拓扑排序失败呢?我们来逐一分析排查。 为什么拓扑排序失败?先检查入度数

热心网友
05.07
2026年比特币减半倒计时:半价门票与投资须知全揭秘
web3.0
2026年比特币减半倒计时:半价门票与投资须知全揭秘

旧金山的秋天,向来是科技行业思潮涌动的季节。而今年10月13日至15日,这座城市将再次成为全球创新者的焦点——比特币世界碘伏大会2026即将在莫斯科尼西馆拉开帷幕。这场盛会不仅是前沿技术的风向标,更是连接顶尖创始人、投资者与科技领袖的关键网络节点。 大会亮点和主题 作为年度科技盛事,比特币世界碘伏大

热心网友
05.07
Sublime Text 4同步配置教程 如何安装Sync Settings插件
编程语言
Sublime Text 4同步配置教程 如何安装Sync Settings插件

想在 Sublime Text 4 里用上 Sync Settings 同步你的配置?这事儿能成,但得先跨过两道坎:插件版本得是 v3 0 或更高,同时你的 ST4 内核也得是比较新的版本。好消息是,2026 年主流发行版基本都达标了。很多朋友遇到的“装不上”、“菜单不出现”、“点了没反应”,十有八

热心网友
05.07
SATA硬盘连接主板必须按顺序接线吗
电脑教程
SATA硬盘连接主板必须按顺序接线吗

SATA硬盘连接主板:接口顺序真有讲究吗? 给主板接SATA硬盘,这事儿本身其实挺自由的。从物理层面看,只要接口对得上,线也插稳了,你随机找个孔插进去,电脑基本都能认出来。不过话说回来,如果你想追求更高的开机效率、更清晰的维护思路,那在接口选择上还真得花点小心思。一个核心建议是:把安装操作系统的那块

热心网友
05.07