編集: David Ruttka のおかげで、Mvc3 の RTM リリースから LabelExtensions.cs を見た後、それを理解することができました。
フィールド名: string field = ExpressionHelper.GetExpressionText(expression);
モデルについては、ヘルパーの場合と同様にキャストしたいモデルを指定する必要がありました。TModel:Foo で、モデルを取得できます。BarTypeEnum barType = ((Foo)html.ViewData.Model).BarType;
以下のソースを、私にとって機能するものに更新しました。
/編集
Mvc3 の LabelFor に似た html ヘルパー関数を作成して、Foo.BarType と html から渡された Foo のフィールドの名前に基づいて文字列値を返そうとしています。
以下の関数 FooLabelFor で、関数に渡されるモデルとフィールド名を取得するにはどうすればよいですか?
System.Web.Mvc.HtmlLabelFor のソースを探しに行きましたが、Mvc3 ソース コードで見つけることができませんでした。
//model class
public class Foo
{
public string Bar { get; set; }
public BarTypeEnum BarType { get; set; }
}
//html helper class
public static class HtmlHelpers {
public static string FooLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where TModel:Foo
{
BarTypeEnum barType = ExpressionHelper.GetExpressionText(expression);
string field = ((Foo)html.ViewData.Model).BarType;
return GlobalizeText(enumHelper.stringvalue(barType), field);
}
}
//html
@model Foo
<div>@Html.FooLabelFor(m => m.Bar)</div>