"Шаблоны могут использоваться только с доступом к полю, доступом к ресурсам, индексом одномерного массива или однопараметрическими выражениями пользовательского индексатора" 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>
}
Это только одна возможность. Просто для любопытства, есть ли другое решение для устранения ошибки?
Ответы
Ответ 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);