当 @ 已经在代码内部时,它会做什么(与内部标记相反)

本文关键字:内部 什么 代码 | 更新日期: 2023-09-27 17:56:04

我正在读史蒂文·桑德森(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是当前类别。现在,有了@它就可以正常工作,您可以看到指向类别的链接,但是没有它,就好像没有类别一样。你什么也看不到。

当 @ 已经在代码内部时,它会做什么(与内部标记相反)

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

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

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

在工作的第一个示例中,它处于剃刀模板模式,当您执行此操作时@Html.RouteLink它会添加到剃须刀模板中,并且 razor 会正确解释并为您呈现您的链接。

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

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

省略@符号时,函数返回结果,但由于它未在任何地方分配或发送,因此会丢失。

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

工程:

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

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