2009-04-08 8 views
0

DTOオブジェクトでは、レンダリングされたhtmlテキストボックスのラベル記述をハードコードしたいので、TextBoxWithLabelのようなhtmlヘルパー関数を使用してオブジェクトのみを渡し、自動的にdescription属性から取得したラベルを作成します。説明属性を使用してラベルテキストを割り当てることはできますか?

<%=Html.TextBoxWithLabel<string>(dto.Title)%> 

をしてレンダリングされたビュー

<label for="Title">Insert the title :</label> 
<input id="Title" type="text" value="" name="Title"/> 

に私はリフレクションを使用する必要があり、これを達成するために考えてもらう:

public class MessageDTO 
{ 
    public int id { get; set; } 
    [Description("Insert the title")] 
    public string Title { get; set; } 
    [Description("Description")] 
    public string Body { get; set; } 
} 

はその後、私のビューページに私が呼び出すしたいと思います。それは正しいのですか、それともビューレンダリングが遅くなりますか?

答えて

3

リフレクションを使用してプロパティから属性を取得する拡張メソッドをHtmlHelperに記述するのが最善の方法です。唯一の問題は、dto.Titleを渡すと文字列の値が渡され、プロパティが必要になることです。私はおそらくオブジェクトとプロパティ名を文字列として渡す必要があると思います。

public static string TextBoxWithLabel<T>(this HtmlHelper base, object obj, string prop) 
{ 
    string label = ""; 
    string input = "<input type=\"text\" value\"\" name=\"" + prop + "\""; 

    Type t = sender.GetType(); 
    PropertyInfo pi = t.GetProperty(prop); 
    object[] array = pi.GetCustomAttributes(typeof(DescriptionAttribute), false); 
    if (array.Length != 0) 
     label = "<label>" + ((DescriptionAttribute)array[0]).Value + "</label>"; 
    return label + input; 
} 

私はメモリからこれをやっているので、ヘルパーの正確な構文は、間違っているかもしれないが、あなたはJISTを取得します。次に、拡張メソッドの名前空間をページにインポートするだけで、この関数を使用できます。

0

はい、あなたはリフレクションで説明を読む必要があります。はい、それはレンダリングを遅くします...少し。減速が心配する価値があるのであれば、プロファイリングだけがあなたに伝えます。おそらく、ページの残りの部分をレンダリングするコストが高くなるため、レンダリングの速度が問題になる場合は、説明属性の読み込みを最適化しようとするよりもページ全体をキャッシュするほうが理にかなっている可能性があります。

これを行うとき、DescriptionAttributeはリテラルキャプションと同様にリソース識別子を取ることができることに注意してください。

関連する問題