2011-10-30 4 views
0

ASP.NET MVC3モデル検証ロジックのソリューションが必要です。私は、カスタムローカリゼーションソリューションを持っていると私は、そのような何か変換するための方法を介してすべての文字列を渡している:MVC3モデルバリデーションメタデータとエラーメッセージを変更する

​​

注:私はよく分からないが、私は、このアプローチはQT localizastionロジックから来ていると思いますが。 WordPressはsmillar技術も使用しています。

私はモデルの検証のために、このソリューションを適用しようというように属性:

[Required(ErrorMessage = Localizer.Translate("Please enter detail text!"))] 
    [DisplayName(Localizer.Translate("Detail"))] 
    public string Details { get; set; } 

コンパイラは、私は、このエラーを与える:

エラー1は属性引数は式または配列のtypeof、定数式でなければなりませんアトリビュートパラメータタイプの作成式...

したがって、エラーメッセージとDisplayName属性をその場で修正しようとしましたが、できませんでした。

これを行う方法はありますか?もしあれば、それは人生の節約になるかもしれません:)

答えて

0

カスタム@Html.LabelFor()および@ html.DescriptionFor()ヘルパーを作成する際の回避策があります。

私のヘルパー:

namespace MyCMS.Helpers 
{ 
public static class Html 
{ 
    public static MvcHtmlString DescriptionFor<TModel, TValue>(
     this HtmlHelper<TModel> self, 
     Expression<Func<TModel, TValue>> expression) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); 
     var description = Localizer.Translate(metadata.Description); 

     return MvcHtmlString.Create(string.Format(@"<span class=""help-block"">{0}</span>", description)); 
    } 

    public static MvcHtmlString LabelFor<TModel, TValue>(
     this HtmlHelper<TModel> self, 
     Expression<Func<TModel, TValue>> expression, 
     bool showToolTip 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(expression, self.ViewData); 
     var name = Localizer.Translate(metadata.DisplayName); 

     return MvcHtmlString.Create(string.Format(@"<label for=""{0}"">{1}</label>", metadata.PropertyName, name)); 
    } 
} 
} 

私の見解は次のとおりです。MyCMS.Localizationを@using

。 @using MyCMS.Helpers;

<div class="clearfix "> 
     @Html.LabelFor(model => model.RecordDetails.TitleAlternative) 
     <div class="input"> 
      @Html.TextBoxFor(model => model.RecordDetails.TitleAlternative, new { @class = "xxlarge" }) 
      @Html.ValidationMessageFor(model => model.RecordDetails.TitleAlternative) 
      @Html.DescriptionFor(model => model.RecordDetails.TitleAlternative) 
     </div> 
    </div> 

と私は私のローカリゼーションのアプローチを使用することができます:)

おかげで、誰も再び...

1

resource files to do localizationを使用することができます。

リソースファイルを追加します(Visual Studioから新しいアイテムの追加ウィザードを使用して、MyResourcesType.resxと呼ぶことができます)。次に、次のような検証メッセージを追加してください:

[Required(
    ErrorMessageResourceType = typeof(MyResourcesType), 
    ErrorMessageResourceName = "MyMessageIdOnTheResourcesFile")] 

これからは新しいリソースファイルを追加するだけです。チェックthis question's first answerを確認してください。

ところでDisplayNameAttributeでもDisplayAttributeからSystem.ComponentModel.DataAnnotations名前空間を使用しないでください。これはMVCで使用される属性なので、ローカライゼーションもできます。

[Display(
    ResourceType = typeof(MyResourcesType), 
    Name = "MyPropertyIdOnResourcesFile_Name", 
    ShortName = "MyPropertyIdOnResourcesFile_ShortName", 
    Description = "MyPropertyIdOnResourcesFile_Description")] 
+0

私は単に、このためにあなた*缶*の使用リソースファイルとは言えないでしょう。これは.NETでのローカライゼーションを処理するために想定されている*方法です。 – Aaronaught

+0

下に私のソリューションを掲載してくれてありがとう – Orhaan

0

属性の仕組みは静的にコンパイルされていることです。したがって、属性を使用するときのような動的な機能を持つことはできません。

Jotaの回答がおすすめですが、独自のソリューションを使用することに決めた場合は、独自の属性を作成して、その属性をメッセージを参照するコードを追加することができます。

関連する問題