2010-12-18 5 views
5

私のMVC2 AdminAreaでは、各ドメインモデルの概要表を作成したいと考えています。私はそれらのドメインモデルオブジェクトのプロパティに次のようにDataAnnotationsを使用しています :MCV2ビューのモデルコレクションからDataAnnotationsを読み取る

[DisplayName("MyPropertyName")] 
public string Name { get; set; } 

今私の質問です:私は私の見解は、私のドメインモデルのコレクションを受信した場合のDisplayName属性にアクセスするにはどうすればよいですか?私は、通常の外に定義されているテーブルヘッダを構築するためにこれを必要とします。

ループです。このループ内で私は

<%: Html.LabelFor(c => item.Name) %> 

を書くことができますが、代わりに、具体的なインスタンスのアイテムのコレクションを使用してこの情報にアクセスする方法はありますか?

ありがとうございます!

+0

あなたのモデルは 'List 'のように丈夫にタイプされていますか? – marcind

+0

はい、IEnumerable です。 – Shackles

答えて

2

FromLambdaExpressionという静的メソッドを持つModelMetaDataクラスがあります。あなたがそれを呼び出してあなたの財産をあなたのViewDataと一緒に渡すと、それはModelMetaDataのインスタンスを返します。そのクラスには、必要なものを提供するDisplayNameプロパティがあります。このオブジェクトから他のメタデータ情報を取得することもできます。

たとえば、空のViewDataDictionaryオブジェクトを作成してこの情報を取得できます。 ModelMetaDataは実際にインスタンスを使用しないため空にすることができます。使用する型を定義するために汎用クラスが必要です。ラムダは、単にあなたがに関するメタデータをするプロパティを見つけようとしているので、あなたが実際のPersonオブジェクトを持っていない場合は

//This would typically be just your view model data.  
ViewDataDictionary<IEnumerable<Person>> data = new ViewDataDictionary<IEnumerable<Person>>(); 

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.First().Name, data); 
string displayName = result.DisplayName; 

First()メソッドの呼び出しでも壊れません。同様に、あなたがdこの単一Personオブジェクトの可能性:

//This would typically be just your view model data.  
ViewDataDictionary<Person> data = new ViewDataDictionary<Person>(); 

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.Name, data); 

あなたはヘルパーや拡張メソッドと有意にこれをクリーンアップすることもできますが、これは正しい道にあなたを置く必要があります。

+0

あなたの答えをありがとう。これは正常に動作しますが、モデルプロパティのセットに対してこれを自動的に実行できるかどうかは疑問です(すべてのプロパティに対して何とか反復処理できますか?)。私は自分の見解で表示したいすべてのDisplayNamesを持つ辞書を作成したくありません。 – Shackles

0

さてさて、私はsgriffinusaのアドバイスに従っ(おかげで再び!)と強く型付けされたのHtmlHelperを作成しました:もちろんTModelのうち

public static MvcHtmlString MetaDisplayName<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    return MvcHtmlString.Create(metadata.GetDisplayName()); 
} 

私のinital質問で述べたように、まだドメインモデルのコレクションですが、我々はできます

<%: Html.MetaDisplayName(p => p.First().Name) %> 
関連する問題