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


107

为什么收到错误消息:

模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用

在此代码:

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

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


3
优秀的!您的解决方案对我有用,而且非常简单。如果您可以将解决方案作为答案而不是更新并接受它,那就太好了。因为我们通常会查看可接受的答案。
2015年

Answers:


101

我有类似的问题

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

当您知道窍门时,这很简单。

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


1
完善!!!感谢您的回答@Daniel,我与这个s ***进行了数小时的
对抗

75

它所指的模板是Html帮助器DisplayFor

DisplayFor期望获得一个表达式,该表达式符合错误消息中指定的规则。

您正在尝试传递要执行的方法链,但它不喜欢它。

这是MVVM(模型-视图-视图模型)模式派上用场的完美示例。

您可以将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


5
+1可以对错误消息进行正确的解释,并提供比其他方法所描述的技巧更好的解决方案。
R. Schreurs

11

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

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

我在这里找到了一个很好的答案

事实证明,您可以使用displayformat装饰模型中的属性,然后应用dataformatstring。

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

using System.ComponentModel.DataAnnotations;

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.