Подтвердить что ты не робот

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

Почему я получаю сообщение об ошибке:

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

по этому коду:

@model IEnumerable<ArtSchoolProject.Models.Trainer>

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_PageLayout.cshtml";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<ul class="trainers">


@foreach (var item in Model) {
<li>
  <div>
      <div class="left">
          <a href="@Url.Action("Details", "Details", new { id = item.ID })">
              <img src="~/Images/Trainer/@item.Picture" />
          </a>
      </div>
      <div class="right">
          @Html.ActionLink(item.Name,"Details",new {id=item.ID})
          <br />
          @Html.DisplayFor(modelItem=>@string. item.Description.ToString().Substring(0,100))
      </div>
  </div>
  </li>
  }

  </ul>

на линии:

@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))

Обновить:

Задача решена. Я добавил в свой код:

  @{
string parameterValue = item.Description.ToString().Substring(0, 100); 
          }
          @Html.DisplayFor(modelItem=>parameterValue)

Мой новый код:

@foreach (var item in Model) {
<li>
  <div>
      <div class="left">
          <a href="@Url.Action("Details", "Details", new { id = item.ID })">
              <img src="~/Images/Trainer/@item.Picture" />
          </a>
      </div>
      <div class="right">
          @Html.ActionLink(item.Name,"Details",new {id=item.ID})
          <br />
          @{
string parameterValue = item.Description.ToString().Substring(0, 100); 
          }
          @Html.DisplayFor(modelItem=>parameterValue)
      </div>
  </div>
 </li>
}

Это только одна возможность. Просто для любопытства, есть ли другое решение для устранения ошибки?

4b9b3361

Ответ 1

У меня была такая же проблема с чем-то вроде

@foreach (var item in Model)
{
    @Html.DisplayFor(m => !item.IsIdle, "BoolIcon")
}

Я решил это, выполнив

@foreach (var item in Model)
{
    var active = !item.IsIdle;
    @Html.DisplayFor(m => active , "BoolIcon")
}

Когда вы знаете трюк, это просто.

Разница в том, что в первом случае я передал метод как параметр, тогда как во втором случае это выражение.

Ответ 2

Шаблон, на который он ссылается, - это хелпер Html DisplayFor.

DisplayFor ожидает выражения, соответствующие правилам, указанным в сообщении об ошибке.

Вы пытаетесь передать цепочку методов для выполнения, и она не нравится.

Это прекрасный пример того, как удобно использовать шаблон MVVM (Model-View-ViewModel).

Вы можете завершить класс модели Trainer в другом классе TrainerViewModel, который может работать примерно так:

class TrainerViewModel
{
    private Trainer _trainer;

    public string ShortDescription
    {
        get
        {
            return _trainer.Description.ToString().Substring(0, 100);
        }
    }

    public TrainerViewModel(Trainer trainer)
    {
        _trainer = trainer;
    }
}

Вы изменили бы класс модели вида, чтобы он содержал все свойства, необходимые для отображения этих данных в представлении, поэтому имя ViewModel.

Затем вы должны изменить свой контроллер, чтобы вернуть объект TrainerViewModel, а не объект Trainer, и изменить объявление типа модели в файле просмотра на TrainerViewModel тоже.

Ответ 3

У меня возникла аналогичная проблема с тем же сообщением об ошибке, используя следующий код:

@Html.DisplayFor(model => model.EndDate.Value.ToShortDateString())

Я нашел хороший ответ здесь

Оказывается, вы можете украсить свойство в своей модели с помощью displayformat, а затем применить форму данных.

Обязательно импортируйте следующую библиотеку в свою модель:

using System.ComponentModel.DataAnnotations;

Ответ 4

Заполните сервисный слой моделью и затем отправьте ее в представление. Например: ViewItem = ModelItem.ToString(). Substring (0,100);