Asp.net-Mvc
Asp.Net MVC:一些未本地化的預設錯誤消息?
我有一個完全本地化的網站,主要是法語/英語/德語。
目前,一切都很好,但我確實注意到一些 asp.net MVC 的錯誤消息存在問題。
我的模型中有一個屬性:
[Required] [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] public DateTime PublicationDate { get; set; }LocalizedDisplayname 是 DisplayNameAttribute 的擴展,它進入 Resx 文件以獲得正確的翻譯
執行緒 CurrentCulture 和 CurrentCultureUI 在 fr-FR 中,因此消息應該以法語顯示(就像我的
[Required]屬性一樣,自動顯示“Le champ Publication est requis”。但是在 DateTime 的情況下,如果我輸入的不是日期,驗證器只會返回一個“
The value 'asdfasdf' is not valid for Publication.”所以:
- 為什麼 MVC 有時會以相同的形式返回法語錯誤消息,有時會以英語返回錯誤消息(我準確地說,這是預設錯誤消息)
- 如何通過指示諸如“值 {0} 不是欄位 {1} 的有效日期”之類的文本來一般替換此消息
非常感謝你
我認為這些回答了你的兩個問題:
- 為什麼 MVC 有時會以相同的形式返回法語錯誤消息,有時會以英語返回錯誤消息(我準確地說,這是預設錯誤消息)
一個顯著的區別是該
[Required]屬性執行顯式客戶端驗證,而當您的欄位不包含有效的 DateTime 時,您會通過預設模型綁定器從發布的表單數據創建 DateTime 對象失敗來獲得伺服器端驗證。這是一種完全不同的機制,我想這可以解釋不同的結果。當然,如果結果是一致的,那就太好了。
- 如何通過指示諸如“值 {0} 不是欄位 {1} 的有效日期”之類的文本來一般替換此消息
有兩種方法:
- 使用屬性告訴預設模型綁定器使用什麼資源字元串來顯示錯誤消息
DefaultModelBinder.ResourceClassKey。有關如何實現此目的的描述,請參閱此相關問題的答案(適用於 MVC 2,但在 MVC 3 中未更改)- 一個更好的方法(我認為)是進行客戶端驗證。這允許您從本地化資源中提供您希望的錯誤消息字元串。通過添加一個
DataType如下所示的屬性來做到這一點,假設您創建了一個資源類,該資源類MyLocalizedResources使用一個字元串呼叫,該字元串的鍵DateTimeFormatValidationMessage在法語中翻譯為“La valeur {0} n’est pas une date valide pour le champ {1}”:[Required] [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")] [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] public DateTime PublicationDate { get; set; }