“模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器expression式”错误

为什么我收到错误:

模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器expression式

在这个代码:

@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> 

}

这只是一种可能性。 只是为了好奇,还有解决错误的另一个解决scheme吗?

它所指的模板是Html助手DisplayFor

DisplayFor期望得到一个符合错误消息中指定的规则的expression式。

你正试图传递一个方法链来执行,它不喜欢它。

这是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对象,并将视图文件中的模型types声明更改为TrainerViewModel

我遇到了类似的问题

 @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") } 

当你知道这个技巧时,很简单。

不同的是,在第一种情况下,我通过一个方法作为参数,而在第二种情况下,它是一个expression式。

我遇到了类似的问题,使用下面的代码相同的错误消息:

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

我在这里find了一个好的答案

原来,你可以使用displayformat来修饰模型中的属性,然后应用一个dataformatstring。

请确保将以下库导入到您的模型中:

 using System.ComponentModel.DataAnnotations;