亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ASP.NET?Core?模型驗(yàn)證消息的本地化新姿勢(shì)詳解

 更新時(shí)間:2025年03月22日 08:57:15   作者:超軟毛毛蟲(chóng)  
文章介紹了如何在ASP.NET Core中對(duì)模型驗(yàn)證消息進(jìn)行本地化,默認(rèn)情況下,驗(yàn)證消息是英文的,不方便用戶(hù)理解,通過(guò)自定義資源類(lèi)并將其放入項(xiàng)目中,可以實(shí)現(xiàn)驗(yàn)證消息的本地化,這樣無(wú)需為每個(gè)模型手動(dòng)指定錯(cuò)誤消息,提升了開(kāi)發(fā)效率,感興趣的朋友一起看看吧

最近在研究系統(tǒng)本地化的問(wèn)題,不可避免要實(shí)現(xiàn)模型類(lèi)的驗(yàn)證消息本地化。畢竟這些錯(cuò)誤消息是要返回給用戶(hù)的。

疑問(wèn)產(chǎn)生

在MVC模型下,我們會(huì)使用模型類(lèi)對(duì)請(qǐng)求參數(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; }
}

這樣本身沒(méi)有什么問(wèn)題,但如果有大量模型要做本地化改造,那可就是個(gè)大工程了。

我們不禁要問(wèn),為什么要指定ErrorMessage,默認(rèn)的錯(cuò)誤消息不能用嗎?畢竟我們?nèi)斯ぶ付ǖ腻e(cuò)誤消息除了字段名之外,其它都完全一樣,實(shí)在沒(méi)有必要逐個(gè)指定。

默認(rèn)消息

我們來(lái)改造一下看看,刪除掉指定的ErrorMessage。

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

如果沒(méi)有傳入?yún)?shù)導(dǎo)致驗(yàn)證不通過(guò),會(huì)得到如下消息:

"The Name field is required."
"The Age field is required."

沒(méi)錯(cuò),默認(rèn)消息是英文的,這對(duì)我們來(lái)說(shuō)完全不可用——這對(duì)用戶(hù)很不友好,難怪要人工設(shè)置ErrorMessage。

查找默認(rèn)消息

那有沒(méi)有可能直接把默認(rèn)消息本地化呢?如果可以,那就不用再麻煩地設(shè)置ErrorMessage了。

通過(guò)查看官方源碼我們發(fā)現(xiàn),默認(rèn)消息來(lái)自SR類(lèi),以RequiredAttribute舉例:

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

SR類(lèi)的內(nèi)容簡(jiǎn)略如下:

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最終會(huì)調(diào)用內(nèi)部聲明的ResourceManager。而 ResourceManager會(huì)根據(jù)傳入的類(lèi)型參數(shù)查找本地化資源。

本地化默認(rèn)消息

通過(guò)上面的分析,如果要使用中文內(nèi)容,我們只要把本地化的消息放入FxResources.System.ComponentModel.Annotations.SR.zh-CN.resources 即可。動(dòng)手之前,我們?cè)俅_認(rèn)一下。

ILSpy 打開(kāi) System.ComponentModel.Annotations.dll,確實(shí)可以看到默認(rèn)的資源FxResources.System.ComponentModel.Annotations.SR.resources,證明我們的分析沒(méi)錯(cuò)。

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

建立語(yǔ)言擴(kuò)展包

我們建立一個(gè)項(xiàng)目,名為 FxResources.System.ComponentModel.Annotations。根據(jù)默認(rèn)規(guī)則,在項(xiàng)目中建立的資源會(huì)自動(dòng)添加命名空間作為前綴。

因此我們只需要再創(chuàng)建名為 SR的資源即可。

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

說(shuō)明:zh-Hans兼容zh-CN、zh-SG;zh-Hant兼容zh-TW、zh-MO、zh-HK。嚴(yán)格講港澳臺(tái)繁體略有差異,但在一般場(chǎng)景可以忽略。

最終效果

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

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

現(xiàn)在我們得到的消息是這樣,看起來(lái)還不錯(cuò)。

"Name 字段為必填項(xiàng)。"
"Age 字段為必填項(xiàng)。"

注意:如果你的項(xiàng)目沒(méi)有啟用國(guó)際化功能,你需要設(shè)置默認(rèn)的文化為中文:CultureInfo.DefaultThreadUICulture = CultureInfo.GetCultureInfo("zh-Hans")

Nuget包

為方便大家使用,已經(jīng)將語(yǔ)言資源打包為語(yǔ)言包,大家直接安裝到項(xiàng)目即可。

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

.NET 不同版本的資源之間有略微差異,大家選擇對(duì)應(yīng)的版本安裝即可。

到此這篇關(guān)于ASP.NET Core 模型驗(yàn)證消息的本地化新姿勢(shì)的文章就介紹到這了,更多相關(guān)ASP.NET Core 模型驗(yàn)證消息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論