私はあちこち検索し、強く型付けされたヘルパーの作成に関連するすべての投稿を読みましたが、私の問題に対処したものはありません。問題:
単純なプロパティを参照する場合、すべてがうまく機能します。
@Html.TextBoxGroupFor(x => x.BadgeNumber)
モデル内の別のクラスのプロパティにアクセスしようとすると、次のエラーが発生します。
@Html.TextBoxGroupFor(x => x.Person.BadgeNumber)
エラーは次のとおりです。
プロパティ InspectionEditViewModel.Person.BadgeNumber が見つかりませんでした。
問題の行は次のとおりです。
var metaData = ModelMetadataProviders.Current.GetMetadataForProperty(() => Activator.CreateInstance<TModel>(), typeof(TModel), displayName);
これは、GetMetadataForProperty が InspectionEditViewModel で BadgeNumber を見つけられないことに関係していると思います。デフォルトでは、MVC の HTML ヘルパーはこれを問題なく実行できます。
編集:
私は何かを忘れていたことを知っていた、長い一日だった. ヘルパーのコードは次のとおりです。
public static MvcHtmlString TextBoxGroupFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression)
{
var inputName = ExpressionHelper.GetExpressionText(expression);
var fullHtmlFieldName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(inputName);
var metaData = ModelMetadataProviders.Current.GetMetadataForProperty(() => Activator.CreateInstance<TModel>(), typeof(TModel), fullHtmlFieldName);
var displayName = metaData.DisplayName ?? inputName;
return TextBoxGroup(helper, displayName, inputName);
}