<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ASP.NET Core 模型驗證消息的本地化新姿勢

      最近在研究系統本地化的問題,不可避免要實現模型類的驗證消息本地化。畢竟這些錯誤消息是要返回給用戶的。

      疑問產生

      在MVC模型下,我們會使用模型類對請求參數進行綁定和驗證。舉個例子:

      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。

      查找默認消息

      那有沒有可能直接把默認消息本地化呢?如果可以,那就不用再麻煩地設置 ErrorMessage了。

      通過查看官方源碼我們發現,默認消息來自 SR 類,以RequiredAttribute舉例:

      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。而 ResourceManager 會根據傳入的類型參數查找本地化資源。

      本地化默認消息

      通過上面的分析,如果要使用中文內容,我們只要把本地化的消息放入 FxResources.System.ComponentModel.Annotations.SR.zh-CN.resources 即可。動手之前,我們再確認一下。

      ILSpy 打開 System.ComponentModel.Annotations.dll,確實可以看到默認的資源 FxResources.System.ComponentModel.Annotations.SR.resources,證明我們的分析沒錯。

       

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

       

       建立語言擴展包

      我們建立一個項目,名為 FxResources.System.ComponentModel.Annotations。根據默認規則,在項目中建立的資源會自動添加命名空間作為前綴。

      因此我們只需要再創建名為 SR 的資源即可。

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

      說明:zh-Hans 兼容 zh-CN、zh-SG;zh-Hant 兼容 zh-TW、zh-MO、zh-HK。嚴格講港澳臺繁體略有差異,但在一般場景可以忽略。

       最終效果

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

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

      現在我們得到的消息是這樣,看起來還不錯。

      "Name 字段為必填項。"
      "Age 字段為必填項。"

      注意:如果你的項目沒有啟用國際化功能,你需要設置默認的文化為中文:CultureInfo.DefaultThreadUICulture = CultureInfo.GetCultureInfo("zh-Hans")

      Nuget 包

      為方便大家使用,已經將語言資源打包為語言包,大家直接安裝到項目即可。

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

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

       

      posted @ 2025-03-21 17:31  超軟毛毛蟲  閱讀(1020)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 精品乱码一区二区三四区视频 | 实拍女处破www免费看| 日韩中文字幕精品人妻| 亚洲最大天堂在线看视频| 亚洲国产天堂久久综合226114| 日本精品人妻无码77777| 国产精品青草久久久久福利99| 久久亚洲精品天天综合网| av资源在线看免费观看| 中文人妻av高清一区二区| 国产精品美女一区二三区| 久久热这里只有精品66| 欧美乱妇狂野欧美在线视频| 亚洲乱理伦片在线观看中字| 免费无码久久成人网站入口| 婷婷五月综合丁香在线| 综合激情丁香久久狠狠| 亚洲美免无码中文字幕在线| 国产精品蜜臀av在线一区| 天天爽夜夜爱| 中文国产不卡一区二区| 国产绿帽在线视频看| 麻豆蜜桃伦理一区二区三区| 国产精品成人99一区无码| 欧美一本大道香蕉综合视频| 激情综合五月| 福利一区二区在线视频| 免费看婬乱a欧美大片| 99热门精品一区二区三区无码| 下面一进一出好爽视频| 国产成人亚洲综合色婷婷秒播| 亚洲国产精品无码久久久| 东京热一区二区三区在线| 人妻少妇偷人无码视频| 欧美一区二区| 男女无遮挡激情视频| 中文字幕av国产精品| 在线天堂www在线| 国产中文字幕一区二区| 午夜福利在线观看6080| 99久久伊人精品综合观看|