7

厳密に型指定された Html ヘルパーを記述するには、よくある問題があります。問題は、プロパティの名前と値のペアを取得する方法です。次の Html ヘルパー宣言があるとします。

public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 

私が見つけたいくつかの解決策があります:1。

var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );

2.

ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;

3. MemberExpression を使用してメンバー名のみを取得する

string GetPropertyName<T>(Expression<Func<T>> property)
{
    var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
    if (propertyInfo == null)
    {
        throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
    }
    return propertyInfo.Name;
}

それらはすべて、最初の外観とは異なる実装を持っています (調査には Reflector を使用しました) が、私は深く掘り下げませんでした。

問題を解決するために非常に多くの方法を試してきましたが、さまざまな状況に適した解決策とその理由を知りたいです。

どんな助けにも感謝します

4

1 に答える 1

3

これらのソリューションは、2 つの異なるコンテキストで使用されます。

1) モデル バインディングの準備として html フィールドに適切なプレフィックスを付けるためにビューによって使用され、ModelMetadata とはほとんど関係ありません。このコードは、サブフォームを実行する必要がある場合に「Customer.Addresses[0].City」を提供します。

このメソッドは、PropertyInfo.Name のみを考慮します。[DisplayName]これにより、属性の内容が得られることはありません。

2) Modelmetadata を操作するために主に使用されるものです。#1 を解決する必要がある場合を除いて、99% の確率で方法 2 を使用します。これにより、DataAnnotations 属性に関連付けられたメタデータも取得されます。このシルは のコンテンツを提供します[DisplayName]

于 2010-10-17T15:18:36.850 に答える