我收到此错误:
模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用。
这是我的代码(自定义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/