2012-05-22 44 views
10

我有一個完全本地化的網站,主要是法語/英語/德語。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 requisis」。

但是在DateTime的情況下,如果我輸入一些東西,是不是日期,驗證只返回我一個「The value 'asdfasdf' is not valid for Publication.」 所以:

  • 爲什麼MVC返回我的法語,有時錯誤信息,有時用英文,以相同的形式(和我準確地說,這是默認的錯誤消息)
  • 「倒樂冠軍{1}拉valeur {0} n'est PAS UNE日期的Valide」

謝謝如何更換此消息genericly,通過指示像文本你非常多

回答

6

我覺得這回答你兩個問題:

  • 爲什麼MVC法語有時會返回我的錯誤信息,有時用英文,以相同的形式(和我精確,這是默認錯誤信息)

一個顯着的區別是,[Required]屬性執行顯式的客戶端驗證,而當您的字段不包含有效的DateTime時,您將通過默認模型聯編程序的失敗獲得服務器端驗證,以便從發佈的表單數據創建DateTime對象。這是一個完全不同的機制,我猜想解釋了不同的結果。當然,如果結果一致,本來會很好。

  • 如何更換此消息genericly,通過指示例如文字 「拉valeur {0} n'est PAS UNE日期的Valide傾樂冠軍{1}」

有有兩種方法:

  1. 通過使用DefaultModelBinder.ResourceClassKey屬性,告訴默認模型聯編程序使用哪個資源字符串作爲錯誤消息。請參閱this related question的答案,瞭解如何實現此目的(對於MVC 2,但它在MVC 3中沒有更改)
  2. 更好的方法(我認爲)是進行客戶端驗證。這使您可以從您的本地化資源中提供您希望的錯誤消息字符串。假設您創建了一個名爲MyLocalizedResources的資源類,並且該字符串的密鑰DateTimeFormatValidationMessage在法語中被翻譯爲「La valeur {0} n'est pas une une date valide pour le champ {1}」,則通過添加DataType屬性來執行此操作:

    [Required] 
    [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")] 
    [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] 
    public DateTime PublicationDate { get; set; } 
    
+0

謝謝。由於所有可本地化的字符串都在不同的DLL中,因此我無法使用'1.'。所以我會用第二個。非常感謝你的回答! – J4N

+0

我可能已經很快接受了答案,我把DataType屬性,正是你如何陳述的,但是當我的類型不是日期時,我仍然有舊消息 – J4N

+1

還有其他數據類型的其他屬性。例如,我爲了顯示所需電子郵件文本字段的本地化錯誤消息: [必需的(ErrorMessageResourceType = typeof(Shared),ErrorMessageResourceName =「RequiredFieldValidationMessage」,ErrorMessage = null)]] [EmailAddress(ErrorMessageResourceType = typeof(Shared), ErrorMessageResourceName =「EmailFormatValidationMessage」,ErrorMessage = null)] public string Email {get;組; } – Clafou

1

ASP.N ET MVC框架執行了一些隱式驗證:一個是需要驗證的,另一個是值是否對屬性有效或者不驗證,以及這兩個事件發生,儘管我們沒有用數據註釋修飾屬性。

您必須在您的全局資源類中爲PropertyValueInvalidPropertyValueRequired創建密鑰。

該線程將幫助您Globally localize validation

0

您可以本地化您的自定義屬性驗證。您還可以本地化ASP.NET MVC內置屬性。

Like [必填]屬性。

一個例子:

[LocalizedRequired(ErrorMessage = "You must specify an email address")] 
string SomeProperty { get; set; } 

,你可以直接覆蓋必需屬性:

public class LocalizedRequiredAttribute: RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return LocalizedString(ErrorMessage, name); 
    } 
} 

的reasone在differen語言露面是:我想在客戶端當前用戶的MVC GET文化代碼側。

+0

根本不是......就像我說的,Thread語言環境是fr-FR。其他信息用正確的語言。甚至客戶端文本都是在服務器端使用服務器語言環境生成的。 (並且默認情況下,我將線程文化設置爲瀏覽器文化) – J4N

0

我有同樣的問題,相同的項目結構。 我終於使用了MVC的約定,試試這種方式。

我全部換成[必需]數據註解與

[必需(ErrorMessageResourceName = 「Common_Mandatory_Field」,ErrorMessageResourceType = typeof運算(MyExternalDllResources.Language))]

在資源字符串 「Common_Mandatory_Field」 在此被定義例如: 意大利資源文件:: Il campo {0}èobbligatorio。

英文資源文件:: {0}字段是必需的。

日本資源文件:: {0}フィールドが必要です。

MVC將取代的{0} [顯示]相關聯的控制的數據的註釋值,如果萬一翻譯的名稱。如果您沒有提供[顯示]數據註釋,則會使用屬性定義。