ASP.NET MVC 3 Бритвенный дисплей для делегата

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.

  • 0
    что ты на самом деле пытаешься сделать? Можете ли вы рассказать нам контекст? Может быть, есть другие решения для достижения этой цели.
  • 0
    @Mohayemin - отредактировано с рассуждениями.
Теги:
razor
lambda
asp.net-mvc-3

2 ответа

1
Лучший ответ

Вам необходимо прочитать сообщение об ошибке:

Шаблоны могут использоваться только с доступом к полю, доступом к свойствам, индексом одномерного массива или однопараметрическими выражениями пользовательского индексатора.

Это говорит вам, что в шаблоне Razor допускаются только определенные типы (очень простых!) лямбда-выражений. Если у вас что-то более сложное, вам нужно вычислить значение, прежде чем пытаться передать его в шаблон. Что-то вроде этого должно работать:

if (property.PropertyName == "LocationType") {
  LocationType locationType = (LocationType) Enum.ToObject(typeof(LocationType), property.Model));
  htmlHelper.DisplayLocationTypeFor(model => locationType, true);
} 
  • 0
    Спасибо, вот и все. Кстати, знаю, что вы, вероятно, не хотели - но вы столкнулись с довольно дерзким. Я прочитал сообщение и получил его несколько раз в прошлом. Я просто не знал, как решить это в этом конкретном сценарии. В любом случае, спасибо за помощь!
  • 0
    Не за что - рад, что смог помочь. Извините, я не хотел быть дерзким.
0

Это можно сделать, составив шаблон отображения для модели LocationType.

Здесь - это ответ, в котором говорится, как достичь этого. Короче говоря:

  • Создайте папку ~/Views/Shared/DisplayTemplates.
  • Создайте представление с именем LocationType в новой папке, созданной с типом модели LocationType. Всякий раз, когда вы пытаетесь выполнить @DisplayFor(model => model.LocationType), создается представление, созданное для LocationType.
  • 0
    Это именно то, что я делаю, В этом фактическом помощнике. Я строю немного логики поверх этого. Используя ваш пример: htmlHelper.DisplayFor(model => ((LocationType)Enum.ToObject(typeof(LocationType), property.Model)), true) все еще не работает с той же ошибкой. Ошибка здесь относится к лямбда-выражению, передаваемому в DisplayFor , ему это не нравится, если модель строго не типизирована для этого типа.
  • 0
    @ RPM1984: извините, я неправильно истолковал ваш вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню