MVC:为什么这可以作为表达式而不是代码块

时间:2016-02-21 07:08:16

标签: asp.net-mvc razor expression

我是一名ASP / MVC新手。我现在正在(并修改)一个脚手架View。我有以下简单的代码,工作正常:

<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的值现在不再显示在视图中(此列中不再显示任何内容)。

我的问题:我在这里做错了什么?

感谢。

1 个答案:

答案 0 :(得分:3)

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

查看代码,方法DisplayFor返回了MvcHtmlString类型的变量,但是代码中的其他地方没有使用它,所以它被丢弃了。

如果要从代码块输出内容,则需要在其前面添加@。这告诉Razor你了解自己在做什么,并希望将结果输出到页面。如果是您的代码,您可以更改代码:

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

虽然没有非常清楚地解释这个具体概念,但你可以看一下this article on MSDN,它解释了@是如何成为剃刀中的神奇角色。