demoshop

demo, trying to be the best_

.NET 中有非常好用的 DataAnnotations 相關 Attr 讓開發者可以快速的處理資料驗證,不過當相同行為很多時,難免會因為不同時期開發或不同的程式人員而導致錯誤訊息顯示的格式不一致,在這裡我將介紹我是如何利用 shared resource 來解決這問題。

本文將使用 Razor Pages 範本專案中的註冊頁面來說明。

情境說明

在 Register.cshtml.cs  檔案中包含了註冊所需要的欄位,其中 Email 的欄位是必填的,所以有Required 的屬性宣告。

[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }

使用者未填寫時就會顯示如下:

未填寫的預設錯誤訊息

正式環境中普遍不會安裝語言檔,所以錯誤訊息都會維持英文,因此開發人員會利用提供的參數ErrorMessage來輸入正體中文的錯誤訊息

[Required(ErrorMessage ="電子郵件必填!")]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }

當整個系統中不只有一個 Email 欄位時,這樣的作法就可能讓錯誤訊息不一致,比如以下的錯誤訊息在開發的過程中都不會覺得有任何問題

[Required(ErrorMessage ="電子郵件必填!")]
[Required(ErrorMessage ="EMAIL必填!")]
[Required(ErrorMessage ="您必須填寫 EMAIL!")]

明明是相同的事情卻在不同頁面用不同的方式提示,使用者用起來就會有一種系統是拼拼湊湊的感覺,因此將所有的錯誤訊息一致化就變成了一個應該要做的事情。

建立 SharedResource 資源檔

首先在專案中建立名為「Resources」的資料夾,再新增資源檔。

名稱就直接使用 SharedResource 

新增後開啟檔案,先建立一個測試用的 Required,並且記得將存取修飾詞調整為 Public

  • 名稱:Required
  • 值:{0}  欄位必填!
  • 註解:(看玩家高興自己輸入)

註冊宣告

再來要告訴程式我們要調整 Data annotations 的 Localizer provider   程式碼如下:

builder.Services.AddRazorPages()
       .AddDataAnnotationsLocalization(options =>
        {
            options.DataAnnotationLocalizerProvider = 
                (type, factory) => factory.Create(typeof(SharedResource));
        });
如果你是 MVC  專案就是在 AddMVC() 後面使用。

實際使用

然後回到 Register.cshtml.cs  將原本的[Required]屬性調整如下

[Required(ErrorMessage ="Required")]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }

ErrorMessage 的部分調整為和剛剛資源檔的 Key 相同,都是 Required,這樣就會自動批配上了,現在將專案重新編譯(Ctrl+F5)後看看效果

為了避免記憶的困難,所以筆者都會將資源檔的key設定的和屬性名稱相同。

將 Password 欄位也如法炮製的處理就可以統一全部必填欄位的提示文字了!

遺珠之憾

利用 SharedResource 的特性一致化訊息這件事情做起來就相當輕鬆,但所有的驗證屬性從此都必須要加上 ErrorMessage 參數還必須帶入指定的文字,這在使用上還是有一點點的不方便,下一篇我們將針對這部分做處理。

回應討論