为什么我收到错误:
- 模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式 *
在这个代码中:
@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>
}
这只是一种可能性。只是出于好奇,有没有其他解决方案来解决这个错误?
8条答案
按热度按时间ohtdti5x1#
我也有同样的问题
我解决了这个问题
当你知道诀窍的时候,就很简单了。
不同的是,在第一种情况下,我传递了一个方法作为参数,而在第二种情况下,它是一个表达式。
deyfvvtc2#
它引用的模板是Html helper
DisplayFor
。DisplayFor期望得到一个符合错误消息中指定的规则的表达式。
你试图传入一个要执行的方法链,但它不喜欢。
这是MVVM(Model-View-ViewModel)模式派上用场的一个完美例子。
你可以将你的
Trainer
模型类 Package 在另一个名为TrainerViewModel
的类中,它可以像这样工作:您可以修改视图模型类,使其包含在视图中显示该数据所需的所有属性,因此命名为ViewModel。
然后修改控制器,返回一个
TrainerViewModel
对象,而不是Trainer
对象,并将视图文件中的模型类型声明也更改为TrainerViewModel
。yebdmbv43#
我遇到了一个类似的问题,使用以下代码显示相同的错误消息:
我发现了一个good answer here
原来你可以在你的模型中用一个displayformat来装饰这个属性,然后再应用一个dataformatstring。
确保将以下库导入到模型中:
lf3rwulv4#
使用
@Html.Raw(item.Description.ToString().Substring(0,100))
2skhul335#
HtmlHelper上的...
For
扩展方法(例如,DisplayFor
,TextBoxFor
,ElementFor
等...)接受一个属性和 * 没有其他 *。如果没有属性,请使用非For
方法(例如Display
、TextBox
、Element
等)。...
For
扩展方法提供了一种简化回发的方法,方法是在属性之后命名控件。这就是为什么它需要一个表达式而不仅仅是一个值。如果您对这种回发便利不感兴趣,请不要使用...For
方法。**注意:**您不应该在视图内部执行调用
ToString
之类的操作。这应该在视图模型内部完成。我意识到许多演示项目都将域对象直接放入视图中。根据我的经验,这种方法很少奏效,因为它假定您不希望对域实体中的数据进行任何格式化。最佳实践是创建一个视图模型,将实体 Package 成可由视图直接使用的内容。此视图模型中的大多数属性应该是已格式化的字符串或已为其创建元素或显示模板的数据。5anewei66#
使用模型填充服务层,然后将其发送到视图。例如:System. out. println();
dwthyt8l7#
将DateTime转换为shortdate的正确语法如下:
smdnsysy8#
如果你想在不创建模板的情况下获取一个视图的子字符串,这将起作用。
Concat()
被用于个人使用,只是为了看看它是否会工作。Substring(0, 100)
只有当数据本身被表示为单个字符串时才能工作。相反,数据库将长字符串NVARCHAR(MAX)
/VARCHAR(MAX)
作为字符串数组或字符串列表,因此Substring()
和ToCharArray()
将失败,因为这两个方法都在查找字符串列表中第一个字符串的长度。通过这种方式,您可以创建一个基于模型的变量,并将其返回到一个列表中,在该列表中使用
Take()
方法获取该列表中的字符。请参考dotnet中的上述方法以获得更好的理解。不管你使用的是C#还是.NET版本。我是.NET Core 6。