我已将问题简化为最简单的形式。为什么这不会在我的页面上输出任何内容?
@if(true){Html.Raw("<a>test</a>");}
编辑
但是,这确实有效:
@if ( true ) { <span>@Html.Raw( "<a>test</a>" )</span>}
我已将问题简化为最简单的形式。为什么这不会在我的页面上输出任何内容?
@if(true){Html.Raw("<a>test</a>");}
编辑
但是,这确实有效:
@if ( true ) { <span>@Html.Raw( "<a>test</a>" )</span>}
我相信这是因为 Razor 引擎对“如果需要”或“如何处理”您编写的第一类代码感到困惑。如果你这样做,那将起作用:
@if(true){@Html.Raw("<a>test</a>");}
注意语法@
开头的。Scott Guthrie 在这里对此进行了Html
解释。它的摘要是这样的:
但是,并非所有内容容器块都以标记元素标记开头,并且存在 Razor 解析器无法隐式检测内容块的情况。
Razor 通过使您能够使用代码块中的 @: 字符序列显式指示内容行的开头来解决此问题。@: 序列表示后面的内容行应被视为内容块。
现在我相信这适用于您的具体问题。
@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 元素下。