2

我已将问题简化为最简单的形式。为什么这不会在我的页面上输出任何内容?

@if(true){Html.Raw("<a>test</a>");}

编辑

但是,这确实有效:

@if ( true ) { <span>@Html.Raw( "<a>test</a>" )</span>}
4

2 回答 2

3

我相信这是因为 Razor 引擎对“如果需要”或“如何处理”您编写的第一类代码感到困惑。如果你这样做,那将起作用:

@if(true){@Html.Raw("<a>test</a>");}

注意语法@开头的。Scott Guthrie 在这里对此进行了Html解释。它的摘要是这样的:

但是,并非所有内容容器块都以标记元素标记开头,并且存在 Razor 解析器无法隐式检测内容块的情况。

Razor 通过使您能够使用代码块中的 @: 字符序列显式指示内容行的开头来解决此问题。@: 序列表示后面的内容行应被视为内容块。

现在我相信这适用于您的具体问题。

于 2013-04-02T12:40:21.237 回答
1
@if(true){Html.Raw("<a>test</a>");}

上面的行不会为您提供 html 输出,因为 razor Parser 通过读取开始和结束字符或 HTML 元素来推断代码结束。因为,您的代码在 if 条件中不包含任何 html 元素,所以解析器将把它评估为表达式,就像我们在控制器中所做的那样。

@if ( true ) { <span>@Html.Raw( "<a>test</a>" )</span>}

这是有效的,因为@Html.Raw它被包裹在 span 元素下。

于 2013-04-02T12:41:38.773 回答