我收到此错误:


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


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

最佳答案

您需要阅读错误消息:


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


它告诉您Razor模板中仅允许某些类型的(非常简单!)lambda表达式。如果您有更复杂的东西,则需要先计算值,然后再尝试将其传递给模板。这样的事情应该起作用:

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

关于c# - ASP.NET MVC 3 Razor DisplayFor委托(delegate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11998537/

10-10 22:56