Я получаю эту ошибку:
Шаблоны могут использоваться только с доступом к полю, доступом к свойствам, индексом одномерного массива или однопараметрическими выражениями пользовательского индексатора.
Здесь мой код (пользовательский 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 допускаются только определенные типы (очень простых!) лямбда-выражений. Если у вас что-то более сложное, вам нужно вычислить значение, прежде чем пытаться передать его в шаблон. Что-то вроде этого должно работать:
if (property.PropertyName == "LocationType") {
LocationType locationType = (LocationType) Enum.ToObject(typeof(LocationType), property.Model));
htmlHelper.DisplayLocationTypeFor(model => locationType, true);
}
Это можно сделать, составив шаблон отображения для модели LocationType
.
Здесь - это ответ, в котором говорится, как достичь этого. Короче говоря:
~/Views/Shared/DisplayTemplates
.LocationType
в новой папке, созданной с типом модели LocationType
.
Всякий раз, когда вы пытаетесь выполнить @DisplayFor(model => model.LocationType)
, создается представление, созданное для LocationType
.htmlHelper.DisplayFor(model => ((LocationType)Enum.ToObject(typeof(LocationType), property.Model)), true)
все еще не работает с той же ошибкой. Ошибка здесь относится к лямбда-выражению, передаваемому в DisplayFor
, ему это не нравится, если модель строго не типизирована для этого типа.