2012-06-10 23 views
23

私はasp.net mvc 4カミソリビューエンジンC#でHtmlHelperを作成しました。asp.net mvc 4カミソリのカスタムHtmlヘルパーから属性にアクセスする

ビューモデルプロパティをヘルパークラスに渡すことはできますか?

例えば、私はこの場合

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

私は(これの@ Html.Example(モデル=> model.Lastname)のような私のヘルパー何かにおよびヘルパーのデータanotationsを取得するよりも、このプロパティを渡すことができる性質を持っていますフィールドには表示名などが必要ですか?)

おかげ

答えて

38

[Display]属性は、メタデータを豊かにします。したがって、メタデータから情報を取得できます。例えば

あなたはヘルパー内の表示名を取得したい場合:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     var displayName = metadata.DisplayName; 
     return new HtmlString(html.Encode(displayName)); 
    } 
} 

し、我々はあなたがビューモデルがあるとした場合:

public class MyViewModel 
{ 
    [Required] 
    [Display(Name = "Your Lastname")] 
    public string Lastname { get; set; } 
} 

をあなたがヘルパーを使用することができます厳密に型指定されたビュー:

@model MyViewModel 

@Html.Example(x => x.Lastname) 

ここで、あなたはカスタムメタデータを書いたとしましょうトリビュート:

あなたとあなたのモデルを飾るために使用さ
public class FooBarAttribute : Attribute, IMetadataAware 
{ 
    public FooBarAttribute(string bar) 
    { 
     Bar = bar; 
    } 
    public string Bar { get; private set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["foo"] = Bar; 
    } 
} 

public class MyViewModel 
{ 
    [Required] 
    [FooBar("This is the bar")] 
    public string SomeBar { get; set; } 
} 

してから、ヘルパーの内側には、カスタム属性を取得できます。

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("foo")) 
     { 
      var foo = metadata.AdditionalValues["foo"] as string; 
      return new HtmlString(html.Encode(foo)); 
     } 
     return MvcHtmlString.Empty; 
    } 
} 

UPDATE:

あなたは必須メッセージを取得するためにeedを実行します。なぜあなたはカスタムヘルパーでこれを行う必要があるのか​​分かりませんが、これを実現する方法の例を以下に示します。

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var me = (ex.Body as MemberExpression); 
     if (me != null) 
     { 
      var required = me 
       .Member 
       .GetCustomAttributes(typeof(RequiredAttribute), false) 
       .Cast<RequiredAttribute>() 
       .FirstOrDefault(); 
      if (required != null) 
      { 
       var msg = required.FormatErrorMessage(me.Member.Name); 
       return new HtmlString(html.Encode(msg)); 
      } 
     } 
     return MvcHtmlString.Empty; 
    } 
} 
+2

Wow。私はあなたが素晴らしいと思う:)あなたは –

+0

ありがとう、私はどのように私はデータの所要メッセージを見つけることができます言うことができますか?私はこのメッセージを取得したい>>> data-val-date = "フィールドBirthDateは日付でなければなりません。 data-val-required = "BirthDateフィールドは必須です。 –

+0

' data-val-required'はクライアント側の属性です。あなたはRequired属性で使用されているメッセージを取得したいと思います。例: –

関連する問題