MVC:为什么它作为表达式而不是代码块工作

MVC: Why does this work as an expression but not as a code block

我是 ASP/MVC 新手。我现在正在使用(和修改)脚手架视图。我有以下简单的代码,工作正常:

<table> 
[... table headers not shown here]
@foreach (var item in Model) {
   <tr>
      <td>
      @Html.DisplayFor(modelItem => item.LandId)
      </td>
      [... other table cells not shown here]
   </tr>
}
</table>

正如我所说,这工作正常:在视图中(在相关列中),显示了相关项目的 属性 LandId 的值。

但是现在,让上面的其他代码保持不变,我替换表达式

@Html.DisplayFor(modelItem => item.LandId)

代码块包含(仅)完全相同的表达式:

@{
Html.DisplayFor(modelItem => item.LandId);
}

显然仍然期望在视图中获得与之前相同的输出。然而,令我惊讶的是,LandId 的值现在不再显示在视图中(此列中不再显示任何内容)。

我的问题:我做错了什么?

谢谢。

当您使用代码块时,该块内的所有内容都只是常规的 C# 代码。此代码不会自动输出到页面。如果将任何未使用的方法 return 值呈现给页面,那会很混乱,不是吗?

查看您的代码,方法 DisplayFor returned 类型 MvcHtmlString 的变量,但未在代码的其他任何地方使用,因此被丢弃。

如果你想从代码块中输出一些东西,你需要在它前面加上@。这告诉 Razor 你明白你在做什么,你想把结果输出到页面。对于您的代码,您可以这样更改代码:

@{
    @Html.DisplayFor(modelItem => item.LandId)
}

虽然这个具体概念解释的不是很清楚,你可以看看this article on MSDN,它解释了@是Razor中的魔法角色