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

POI*_*OIR 95 c# asp.net string asp.net-mvc-4

为什么我收到错误:

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

在这段代码:

@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>
Run Code Online (Sandbox Code Playgroud)

在线:

@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))
Run Code Online (Sandbox Code Playgroud)

更新:

问题解决了.我添加到我的代码中:

  @{
string parameterValue = item.Description.ToString().Substring(0, 100); 
          }
          @Html.DisplayFor(modelItem=>parameterValue)
Run Code Online (Sandbox Code Playgroud)

我的新代码:

@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>
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iel 85

我有同样的问题

@foreach (var item in Model)
{
    @Html.DisplayFor(m => !item.IsIdle, "BoolIcon")
}
Run Code Online (Sandbox Code Playgroud)

我这样解决了这个问题

@foreach (var item in Model)
{
    var active = !item.IsIdle;
    @Html.DisplayFor(m => active , "BoolIcon")
}
Run Code Online (Sandbox Code Playgroud)

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

不同之处在于,在第一种情况下,我传递了一个方法作为参数,而在第二种情况下,它是一个表达式.

  • 不不不。这是一个糟糕的模式。使用“@Html.Display”。仅当您希望渲染的 HTML 以属性命名时,您才需要“DisplayFor”——如果您希望它回发到同一属性。_This_ 以及人们在花括号内使用 `RenderAction` 而不仅仅是 `Action`。这让我感觉好像没有人真正了解 MVC 是如何工作的。 (4认同)
  • 这只是我需要的技巧 - 非常感谢! (2认同)

Sea*_*rey 70

它所指的模板是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以修改视图模型类以包含在视图中显示该数据所需的所有属性,因此名称为ViewModel.

然后,您将修改控制器以返回TrainerViewModel对象而不是Trainer对象,并在视图文件中更改模型类型声明TrainerViewModel.

  • +1用于对错误消息进行正确解释,并提供比其他人描述的技巧更好的解决方案. (3认同)

Rob*_*Rob 8

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

@Html.DisplayFor(model => model.EndDate.Value.ToShortDateString())
Run Code Online (Sandbox Code Playgroud)

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

事实证明,您可以使用displayformat在模型中修饰属性,然后应用dataformatstring.

请务必将以下lib导入模型:

using System.ComponentModel.DataAnnotations;
Run Code Online (Sandbox Code Playgroud)