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

为什么我会收到这个错误:

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

在这个代码:

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

这只是一种可能性。出于好奇,还有其他解决这个错误的方法吗?

147915 次浏览

它引用的模板是 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

我也有同样的问题

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

当你知道诀窍的时候,就很简单了。

区别在于,在第一种情况下,我将一个方法作为参数传递,而在第二种情况下,它是一个表达式。

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

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

我找到了一个 回答得好

原来你可以用一个 displayformat 来装饰模型中的属性,然后应用一个 dataformat 字符串。

确保将下面的 lib 导入到您的模型中:

using System.ComponentModel.DataAnnotations;

用模型填充服务层,然后将其发送到视图。 例如: ViewItem = ModelItem.ToString () . Substring (0,100) ;

HtmlHelper 上的... For扩展方法(例如,DisplayForTextBoxForElementFor等等)。.)取得财产和 没别的了。如果没有属性,可以使用非 For方法(例如,DisplayTextBoxElement等等)。.).

For扩展方法通过以属性命名控件来简化回发。这就是为什么它需要一个表达式而不仅仅是一个值。如果你对这个回发促进不感兴趣,那么根本不要使用... For方法。

注意: 您不应该在视图中调用 ToString。这应该在视图模型中完成。我意识到许多演示项目将领域对象直接放入视图中。根据我的经验,这种方法很少奏效,因为它假定您不希望对域实体中的数据进行任何格式化。最佳实践是创建一个视图模型,该模型将实体包装成可以被视图直接使用的内容。此视图模型中的大多数属性应该是已经格式化的字符串或已创建元素或显示模板的数据。

使用 @Html.Raw(item.Description.ToString().Substring(0,100))

将 DateTime 转换为短日期的正确语法如下:

    @foreach (var item in Model)
{
@{var endDate= !item.EndDate.ToShortDateString();}
@Html.DisplayFor(m => endDate,)
}