ASP.NET?Core?模型驗(yàn)證消息的本地化新姿勢詳解
最近在研究系統(tǒng)本地化的問題,不可避免要實(shí)現(xiàn)模型類的驗(yàn)證消息本地化。畢竟這些錯(cuò)誤消息是要返回給用戶的。
疑問產(chǎn)生
在MVC模型下,我們會使用模型類對請求參數(shù)進(jìn)行綁定和驗(yàn)證。舉個(gè)例子:
public class UserDto
{
[Required(ErrorMessage = "姓名不能為空")]
public string Name{get; set;}
[Required(ErrorMessage = "年齡不能為空")]
[Range(1, 120, ErrorMessage = "年齡必須在1到120之間")]
public int? Age {get; set; }
}這樣本身沒有什么問題,但如果有大量模型要做本地化改造,那可就是個(gè)大工程了。
我們不禁要問,為什么要指定ErrorMessage,默認(rèn)的錯(cuò)誤消息不能用嗎?畢竟我們?nèi)斯ぶ付ǖ腻e(cuò)誤消息除了字段名之外,其它都完全一樣,實(shí)在沒有必要逐個(gè)指定。
默認(rèn)消息
我們來改造一下看看,刪除掉指定的ErrorMessage。
public class UserDto
{
[Required]
public string Name{get; set;}
[Required]
[Range(1, 120)]
public int? Age {get; set; }
}如果沒有傳入?yún)?shù)導(dǎo)致驗(yàn)證不通過,會得到如下消息:
"The Name field is required."
"The Age field is required."
沒錯(cuò),默認(rèn)消息是英文的,這對我們來說完全不可用——這對用戶很不友好,難怪要人工設(shè)置ErrorMessage。
查找默認(rèn)消息
那有沒有可能直接把默認(rèn)消息本地化呢?如果可以,那就不用再麻煩地設(shè)置ErrorMessage了。
通過查看官方源碼我們發(fā)現(xiàn),默認(rèn)消息來自SR類,以RequiredAttribute舉例:
public RequiredAttribute()
: base(() => SR.RequiredAttribute_ValidationError)
{
}SR類的內(nèi)容簡略如下:
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最終會調(diào)用內(nèi)部聲明的ResourceManager。而 ResourceManager會根據(jù)傳入的類型參數(shù)查找本地化資源。
本地化默認(rèn)消息
通過上面的分析,如果要使用中文內(nèi)容,我們只要把本地化的消息放入FxResources.System.ComponentModel.Annotations.SR.zh-CN.resources 即可。動(dòng)手之前,我們再確認(rèn)一下。
ILSpy 打開 System.ComponentModel.Annotations.dll,確實(shí)可以看到默認(rèn)的資源FxResources.System.ComponentModel.Annotations.SR.resources,證明我們的分析沒錯(cuò)。

默認(rèn)(中立語言)資源里面包含了錯(cuò)誤消息,也包含了內(nèi)部的異常消息。我們可以全部或者選擇地本地化它們。

建立語言擴(kuò)展包
我們建立一個(gè)項(xiàng)目,名為 FxResources.System.ComponentModel.Annotations。根據(jù)默認(rèn)規(guī)則,在項(xiàng)目中建立的資源會自動(dòng)添加命名空間作為前綴。
因此我們只需要再創(chuàng)建名為 SR的資源即可。

如圖,我們建立了對應(yīng)的中文簡體和中文繁體資源,這樣就大功告成了!

說明:zh-Hans兼容zh-CN、zh-SG;zh-Hant兼容zh-TW、zh-MO、zh-HK。嚴(yán)格講港澳臺繁體略有差異,但在一般場景可以忽略。
最終效果
同樣是之前的例子,我們不需要再指定ErrorMessage。
public class UserDto
{
[Required]
public string Name{get; set;}
[Required]
[Range(1, 120)]
public int? Age {get; set; }
}現(xiàn)在我們得到的消息是這樣,看起來還不錯(cuò)。
"Name 字段為必填項(xiàng)。"
"Age 字段為必填項(xiàng)。"
注意:如果你的項(xiàng)目沒有啟用國際化功能,你需要設(shè)置默認(rèn)的文化為中文:CultureInfo.DefaultThreadUICulture = CultureInfo.GetCultureInfo("zh-Hans")
Nuget包
為方便大家使用,已經(jīng)將語言資源打包為語言包,大家直接安裝到項(xiàng)目即可。
Install-Package FxResources.System.ComponentModel.Annotations.zh-Hans -Version 9.0.0
.NET 不同版本的資源之間有略微差異,大家選擇對應(yīng)的版本安裝即可。
到此這篇關(guān)于ASP.NET Core 模型驗(yàn)證消息的本地化新姿勢的文章就介紹到這了,更多相關(guān)ASP.NET Core 模型驗(yàn)證消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.NET?Core?6.0?基于模型驗(yàn)證的數(shù)據(jù)驗(yàn)證功能
- ASP.NET?Core中Cookie驗(yàn)證身份用法詳解
- asp.net core3.1cookie和jwt混合認(rèn)證授權(quán)實(shí)現(xiàn)多種身份驗(yàn)證方案
- asp.net core配合vue實(shí)現(xiàn)后端驗(yàn)證碼邏輯
- [Asp.Net Core]用Blazor Server Side實(shí)現(xiàn)圖片驗(yàn)證碼
- ASP.NET Core實(shí)現(xiàn)自定義WebApi模型驗(yàn)證詳解
- asp.net core系列之模型綁定和驗(yàn)證方法
- ASP.NET Core WebApi中使用FluentValidation驗(yàn)證數(shù)據(jù)模型的方法
相關(guān)文章
如何在ASP.NET Core應(yīng)用程序運(yùn)行Vue并且部署在IIS上詳解
這篇文章主要給大家介紹了關(guān)于如何運(yùn)行Vue在ASP.NET Core應(yīng)用程序并且部署在IIS上的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
ASP.NET實(shí)現(xiàn)個(gè)人信息注冊頁面并跳轉(zhuǎn)顯示
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)個(gè)人信息注冊頁面并跳轉(zhuǎn)顯示的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
asp.net中通過DropDownList的值去控制TextBox是否可編寫的實(shí)現(xiàn)代碼
Web窗體上有兩控件,DropDownList1,TextBox1,當(dāng)DropDownList的值選擇是YES的時(shí)候,TextBox1可編輯,當(dāng)選擇NO的時(shí)候,TextBox1的值為空,并且不能編輯,該如何實(shí)現(xiàn)2012-11-11
WPF集合控件實(shí)現(xiàn)分隔符(ItemsControl Separator)
這篇文章主要為大家詳細(xì)介紹了WPF集合控件實(shí)現(xiàn)分隔符ItemsControl Separator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

