我现在已经习惯了剃刀,但我不明白为什么以下语法是正确的?
<li @(active ? "class=active" : "")>
@Html.ActionLink(item.Text, item.TargetAction, Model.Controller)
</li>
正如你所看到的那样,我有条件地应用了一个类(我用这种方式编写它,所以如果bool active == false则不会生成类标记。)
我无法理解为什么这会产生正确的引号给出:
<li class="active"><a href="/">Home</a></li>
<a href="/">Home</a>
</li>
不知何故,它神奇地整理出引用,但我在剃刀的文章中找不到任何参考来暗示这是预期的,所以我想知道它是否依赖于破坏的行为。如果我在单词'active'周围的字符串中添加单引号或双引号,就像你想要的那样,如果你想要html,我最终得到:
<li class="'active'">
<a href="/">Home</a>
</li>
或
<li class="active">
<a href="/">Home</a>
</li>
为什么它以这种方式工作,并且我的代码是正确的(与简单的功能相反)?
答案 0 :(得分:15)
Razor自动HTML转义所有代码输出。
您可以通过撰写@Html.Raw(...)
或者,您可以将引号放在文字文本中:
<li class="@(active ? "active" : "")>
您的示例有效,因为您实际上没有任何引号
生成的HTML源代码为<li class=active>
。
答案 1 :(得分:15)
刚刚碰到这个想法会回答 - SLaks看起来是正确的Html.Raw,但OP也是正确的,因为第二种方法看起来不起作用 - “被编码。”
我的解决方案是:
<li@(active ? Html.Raw(" class=\"active\"") : null)>
答案 2 :(得分:3)
也遇到了这种奇怪的行为。从逻辑上讲,以下内容应该有效。
@(Model.IsTablet ? "data-options='is_hover: false'" : "")
但呈现为
data-options="'is_hover:" false'=""
正如丹所说这可以正常工作
@(Model.IsTablet ? "data-options=is_hover:false" : "")
渲染作为第一个例子应该。
data-options="is_hover:false"
但是如果你在属性中添加一个空格,它就会破坏asp.net 4.0正在做的任何奇怪的东西,它认为你的属性在空格处结束。
这并不构成html转义,因为什么是有效的html语法不起作用,剃刀的全部意义是剃刀语法应该与有效的html一起工作而不是破坏它。