11

私は完全にローカライズされたウェブサイトを持っています。それは主にフランス語/英語/ドイツ語です。

今のところ、すべてが順調に進んでいますが、asp.netMVCのエラーメッセージに問題があることに気づきました。

モデルに1つのプロパティがあります。

[Required]
[LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))]
public DateTime PublicationDate { get; set; }

LocalizedDisplaynameはDisplayNameAttributeの拡張であり、Resxファイルに入力して正しい翻訳を取得します

スレッドCurrentCultureとCurrentCultureUIはfr-FRであるため、メッセージはフランス語で表示する必要があります(私の[Required]属性の場合と同様に、「Le champPublicationestrequis」を自動的に表示します。

しかし、DateTimeの場合、日付ではないものを入力すると、バリデーターは単に「The value 'asdfasdf' is not valid for Publication.」を返します。

  • MVCがフランス語で、場合によっては英語で同じ形式のエラーメッセージを返す理由(正確には、これがデフォルトのエラーメッセージです)
  • 「Lavaleur{0}n'est pas une date valide pour le champ {1}」のようなテキストを指定して、このメッセージを一般的に置き換える方法

どうもありがとうございます

4

4 に答える 4

7

これらはあなたの2つの質問に答えると思います:

  • MVCがフランス語で、場合によっては英語で同じ形式のエラーメッセージを返す理由(正確には、これがデフォルトのエラーメッセージです)

注目すべき違いの1つは、[Required]属性が明示的なクライアント側の検証を実行するのに対し、フィールドに有効なDateTimeが含まれていない場合、デフォルトのモデルバインダーが投稿されたフォームデータからDateTimeオブジェクトを作成できなかったため、サーバー側の検証が行われることです。これはまったく異なるメカニズムであり、異なる結果を説明していると思います。もちろん、結果が一貫していれば良かったでしょう。

  • 「Lavaleur{0}n'est pas une date valide pour le champ {1}」のようなテキストを指定して、このメッセージを一般的に置き換える方法

2つの方法があります:

  1. プロパティを使用して、デフォルトのモデルバインダーにエラーメッセージに使用するリソース文字列を指示しDefaultModelBinder.ResourceClassKeyます。これを実現する方法の説明については、この関連する質問への回答を参照してください(MVC 2の場合ですが、MVC 3では変更されていません)
  2. より良い方法(私は思う)は、クライアント側の検証を行うことです。これにより、ローカライズされたリソースから必要なエラーメッセージ文字列を提供できます。フランス語で「Lavaleur{0}n'est pas une date valide pour le champ {1}」と翻訳されたキーを持つ文字列でDataType呼び出されるリソースクラスを作成したと仮定して、以下のように属性を追加します。MyLocalizedResourcesDateTimeFormatValidationMessage

    [Required]
    [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")]
    [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))]
    public DateTime PublicationDate { get; set; }
    
于 2012-06-06T14:42:59.923 に答える
1

ASP.NET MVCフレームワークは、いくつかの暗黙的な検証を行います。1つは必須の検証であり、もう1つは値がプロパティに対して有効かどうかであり、この2つは、プロパティをデータ注釈で装飾していなくても発生します。

グローバルリソースクラスのキーを作成する必要がPropertyValueInvalidあります。PropertyValueRequired

このスレッドは、検証をグローバルにローカライズするのに役立ちます

于 2012-06-06T14:41:31.367 に答える
1

私は同じ問題、同じプロジェクト構造を持っていました。私はついにMVCの規則を使用しました、この方法を試してください。

すべての[必須]データアノテーションを次のように置き換えました

[Required(ErrorMessageResourceName = "Common_Mandatory_Field"、ErrorMessageResourceType = typeof(MyExternalDllResources.Language))]

リソース文字列「Common_Mandatory_Field」では、次のように定義されています。例:イタリア語リソースファイル:: Ilcampo{0}èobbligatorio。

英語のリソースファイル::{0}フィールドは必須です。

日本のリソースファイル::{0}フィールドが必要です。</p>

MVCは、{0}を関連するコントロールの[表示]データ注釈値の名前に置き換えます。場合によっては変換されます。[表示]データ注釈を指定しない場合、プロパティ定義が使用されます。

于 2013-06-08T20:04:38.157 に答える
0

カスタム検証属性をローカライズできます。また、ASP.NETMVCの組み込み属性をローカライズします。

[必須]属性のように。

例:

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

そして、あなたはただRequiredプロパティをオーバーライドすることができます:

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

異なる言語で表示される理由は次のとおりです。mvcはクライアント側で現在のユーザーのカルチャコードを取得すると思います。

于 2012-06-09T00:14:53.473 に答える