2

我收到此错误:

模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用。

这是我的代码(自定义 HTML 帮助程序,包装 DisplayFor 以便我可以选择模板):

public static string DisplayLocationTypeFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, LocationType>> expression, bool plural = false)
{
   return plural ? 
      htmlHelper.DisplayFor(expression, "LocationTypePlural").ToHtmlString() :
      htmlHelper.DisplayFor(expression).ToHtmlString();
}

当我这样使用它时,它可以工作:

@Html.DisplayLocationTypeFor(model => model.LocationType)

因为model具有 的属性LocationType

但是当我在另一个自定义 HTML 助手中执行此操作时:

public static MvcHtmlString SearchPreferenceButtonForModel<TModel>(this HtmlHelper<TModel> htmlHelper)
{
   // .. other code
   foreach (var property in htmlHelper.ViewData.ModelMetadata.Properties)
   {
      if (property.PropertyName == "LocationType")
         htmlHelper.DisplayLocationTypeFor(model => ((LocationType)Enum.ToObject(typeof(LocationType), property.Model)), true);
   } 
}

它错误。

我可以更改我的DisplayLocationTypeFor助手来使用htmlHelper.Display,但我不确定如何。

有任何想法吗?

我想要做的是,我有一种特定的方式来渲染LocationType模型,我希望在整个站点上发生这种情况。在内部,模板使用资源文件,以及基于 URL 的其他一些智能。换句话说,有逻辑——我不想重复。

这样,我所有的视图/模板都会调用此模板作为呈现LocationType.

4

2 回答 2

1

您需要阅读错误信息:

模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用。

它告诉您 Razor 模板中只允许使用某些类型的(非常简单!) lambda 表达式。如果您有更复杂的内容,则需要在尝试将其传递给模板之前计算该值。像这样的东西应该工作:

if (property.PropertyName == "LocationType") {
  LocationType locationType = (LocationType) Enum.ToObject(typeof(LocationType), property.Model));
  htmlHelper.DisplayLocationTypeFor(model => locationType, true);
} 
于 2012-08-17T05:43:05.637 回答
0

LocationType您可以通过为模型编写显示模板来实现这一点。

是一个答案,说明了如何实现这一目标。简而言之:

  1. 创建一个文件夹~/Views/Shared/DisplayTemplates
  2. 在您创建的新文件夹中创建一个名为LocationTypemodel type的视图LocationType。每当您尝试 a@DisplayFor(model => model.LocationType)时,您为其创建的视图LocationType都会被渲染。
于 2012-08-17T04:06:24.557 回答