2011-12-14 8 views
0

ユーザーに役立つヒントを表示するために使用できる新しい属性のTipAttributeを作成したいとします。MVC3のモデルにTipAttributeを追加する方法

public class EditPersonModel { 
    [Display(Name = "Full Name")] 
    [Tip(Message = "Enter the person's full name.")] 
    public string Name { get; set; } 
} 

は、だから私のビューから私は

<div class="editor-field"> 
    @Html.InputFor(m => m.Name) 
    @Html.TipFor(m => m.Name) 
</div> 

をするでしょうし、それは私がHtmlHelperのために拡張メソッドを記述する必要があるだろうことを知っているが、私はありません持っている

<div class="editor-field"> 
    <input id="Name" name="Name" type="text" value=""> 
    <div class="tip">Enter the person's full name.</div> 
</div> 

をレンダリングします何が内部に入るべきか考えてください!

public static MvcHtmlString TipFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { 
    ??? 
} 

私はMvc3ソースコード内のDisplayAttributeの実装を見始めましたが、それは非常に複雑だと私自身のカスタム属性を提供するようには見えませんが、プラグイン可能な/非常に簡単です。これを行うための標準MVC3の方法はありますか?

ありがとうございました!

答えて

4

と仮定すると、お使いの先端属性は、メタデータを認識しました。

public class TipAttribute: Attribute, IMetadataAware 
{ 
    public string Message { get; set; } 

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

あなた可能性:

public static class HtmlExtensions 
{ 
    public static IHtmlString TipFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression 
    ) 
    { 
     var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     var tip = metaData.AdditionalValues["tip"] as string; 
     var div = new TagBuilder("div"); 
     div.AddCssClass("tip"); 
     div.SetInnerText(tip ?? string.Empty); 
     return new HtmlString(div.ToString()); 
    } 
} 
+0

すごいです!私はまだテストしていませんが、これは完全に意味があり、これは私が望んでいたものです... IMetadataAwareのようなシステムで、組み込みのLambdaパーサーを拡張できます。 – parleer

関連する問題