“模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器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;