0

私はあちこち検索し、強く型付けされたヘルパーの作成に関連するすべての投稿を読みましたが、私の問題に対処したものはありません。問題:

単純なプロパティを参照する場合、すべてがうまく機能します。

@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);
        }
4

1 に答える 1

1
ModelMetadata.FromLambdaExpression(propertyExpression, html.ViewData);

これはあなたが探しているものです。残念ながら、これは html が、モデルがメタデータを取得しようとしているタイプのビューからの HtmlHelper のインスタンスでなければならないことを意味します。

これは、Model/ViewData からプロパティ値を取得し、それを ModelMetadataProvider で渡して、問題のモデル インスタンスに固有のメタデータを入力できるようにするためだと思います。

インスタンス固有のメタデータを気にしない場合 (例: データ注釈属性のみが必要な場合) は、新しい ViewDataDictionary を渡すだけです (ここで、TModel は取得するメタデータの型です)。

おまけに、FromLambdaExpression メソッドは式とその解決されたプロパティ パスを内部にキャッシュして、パフォーマンスを向上させます。

お役に立てば幸いです。

于 2013-10-17T12:36:24.127 に答える