4

我正在阅读 Steven Sanderson 的关于 ASP.NET 的书,我已经到了让我非常困惑的地步。

作品

@foreach (var link in Model)
{
    @Html.RouteLink(link, new { controller = "Product", action = "List", category = link, page = 1 });
}

不工作

@foreach (var link in Model)
{
    Html.RouteLink(link, new { controller = "Product", action = "List", category = link, page = 1 });
}

(区别是块内的第一个字符)

在这两种情况下,Razor 都知道它是代码而不是标记 (HTML),那么为什么我必须将@符号放在开头呢?有什么区别&我错过了什么?

编辑:

我应该澄清什么不起作用。这是一个菜单,link是当前类别。现在,有了@它可以正常工作,您可以看到类别的链接,但没有它,就好像没有类别..您什么也看不到。

4

4 回答 4

2

当您使用分号时;(或没有@)它正在执行一行代码,但返回不会写入响应流,而没有它并且通过使用@,它会在该点将结果(MvcHtmlString)直接返回到响应流。

于 2013-01-24T15:49:37.990 回答
2

解析器内部会foreach自动判断它是处于代码模式还是剃刀模板模式,从而允许您输出 html、剃刀或代码。

这两个语句的区别是一个是在剃刀模板模式(工作),另一个是在代码模式(不工作)

Html.RouteLink返回一个MvcHtmlString,在您的第二个示例中(在代码模式下),您执行一个函数并且对MvcHtmlString返回的函数不执行任何操作,因此在您请求页面时不会呈现任何内容。

在第一个工作示例中,它处于 razor 模板模式,当您这样做时,@Html.RouteLink它会添加到 razor 模板中,并且 razor 会正确解释并为您呈现链接。

于 2013-01-24T15:52:16.643 回答
2

@实例中的 表示您要将语句的结果输​​出给用户。类似于Response.Write()

@符号被省略时,函数返回结果,但由于它没有被分配或发送到任何地方,它就丢失了。

于 2013-01-24T15:53:17.547 回答
0

要记住的是,您也可以在该 foreach 块中包含 html:

作品:

@if (someConditionalExpression)
{
    <p>Only shown if the conditional was true.</p>
}

由于标记在这里也是合法的,因此您需要使用@符号向视图引擎指示您想要再次编码,而不是标记。否则,你想要的就是模棱两可的。

于 2013-01-24T15:50:24.753 回答