剃刀查看引擎自动应用报价?

时间:2012-02-10 20:37:42

标签: asp.net razor

我现在已经习惯了剃刀,但我不明白为什么以下语法是正确的?

<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=&quot;active&quot;>
    <a href="/">Home</a>
</li>

为什么它以这种方式工作,并且我的代码是正确的(与简单的功能相反)?

3 个答案:

答案 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&#39;=""

正如丹所说这可以正常工作

@(Model.IsTablet ? "data-options=is_hover:false" : "")

渲染作为第一个例子应该。

data-options="is_hover:false"

但是如果你在属性中添加一个空格,它就会破坏asp.net 4.0正在做的任何奇怪的东西,它认为你的属性在空格处结束。

这并不构成html转义,因为什么是有效的html语法不起作用,剃刀的全部意义是剃刀语法应该与有效的html一起工作而不是破坏它。