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 回答