【问题标题】:ASP.NET MVC 3 Razor DisplayFor DelegateASP.NET MVC 3 Razor DisplayFor Delegate
【发布时间】:2012-08-17 01:05:27
【问题描述】:

我收到此错误:

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

这是我的代码(自定义 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 的标准方式。

【问题讨论】:

  • 你到底想做什么?你能告诉我们背景吗?可能还有其他解决方案可以实现这一目标。
  • @Mohayemin - 经过推理编辑。

标签: c# asp.net-mvc-3 razor lambda display-templates


【解决方案1】:

您需要阅读错误信息:

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

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

if (property.PropertyName == "LocationType") {
  LocationType locationType = (LocationType) Enum.ToObject(typeof(LocationType), property.Model));
  htmlHelper.DisplayLocationTypeFor(model => locationType, true);
} 

【讨论】:

  • 谢谢,就是这样。顺便说一句,知道你可能不是故意的——但你给人的印象是很傲慢。我确实阅读了该消息,并且过去曾收到过几次。我只是不知道如何在这种特定情况下解决它。无论如何,谢谢你的帮助!
  • 不客气——很高兴我能帮上忙。对不起,我不是故意的。
【解决方案2】:

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

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

  1. 创建一个文件夹~/Views/Shared/DisplayTemplates
  2. 在您使用模型类型LocationType 创建的新文件夹中创建一个名为LocationType 的视图。 每当您尝试 @DisplayFor(model =&gt; model.LocationType) 时,您为 LocationType 创建的视图都会被渲染。

【讨论】:

  • 这正是我正在做的,在那个真正的帮手中。在此之上,我正在构建一些逻辑。使用您的示例:htmlHelper.DisplayFor(model =&gt; ((LocationType)Enum.ToObject(typeof(LocationType), property.Model)), true) 仍然会出现相同的错误。这里的错误与传递给 DisplayFor 的 lambda 表达式有关,除非模型被强类型化为该类型,否则它不喜欢它。
  • @RPM1984:很抱歉我误解了你的问题。
猜你喜欢
  • 2016-07-04
  • 2011-07-07
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2011-03-24
  • 2011-09-19
相关资源
最近更新 更多