我已将问题简化为最简单的形式。为什么这不会在我的页面上输出任何内容?
@if(true){Html.Raw("<a>test</a>");}
修改
但这确实有效:
@if ( true ) { <span>@Html.Raw( "<a>test</a>" )</span>}
答案 0 :(得分:3)
我相信这是因为Razor引擎混淆了“如果它需要”或“如何处理”您编写的第一类代码。如果你这样做,那将是有效的:
@if(true){@Html.Raw("<a>test</a>");}
请注意@
语法开头的Html
。关于那个问题an explanation here by Scott Guthrie。总结如下:
并非所有内容容器块都以标记元素标记开头, 并且有些情况下Razor解析器无法隐式检测 内容块。
Razor通过让您明确指出来解决这个问题 使用@:字符序列开始一行内容 在代码块中。 @:序列表示该行 以下内容应被视为内容块。
现在我认为这适用于您的具体问题。
答案 1 :(得分: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元素下。