请注意,您可以这样做(至少在 MVC3 中):
<td align="left" @(isOddRow ? "class=TopBorder" : "style=border:0px") >
我认为剃须刀添加引号实际上是浏览器。正如 Rism 在使用 MVC 4 进行测试时指出的那样(我没有使用 MVC 3 进行测试,但我认为行为没有改变),这实际上会产生 class=TopBorder 但浏览器能够很好地解析它。 HTML 解析器对缺少属性引号有点宽容,但是如果您有空格或某些字符,这可能会中断。
<td align="left" class="TopBorder" >
或
<td align="left" style="border:0px" >
提供自己的报价有什么问题
如果您尝试对嵌套引号使用一些常用的 C# 约定,那么您最终会得到比预期更多的引号,因为 Razor 正试图安全地避开它们。例如:
<button type="button" @(true ? "style=\"border:0px\"" : string.Empty)>
这应该评估为<button type="button" style="border:0px">,但 Razor 会转义 C# 的所有输出并因此产生:
style="border:0px"
只有在通过网络查看响应时才会看到此信息。如果您使用 HTML 检查器,通常您实际上看到的是 DOM,而不是原始 HTML。浏览器将 HTML 解析为 DOM,解析后的 DOM 表示已经应用了一些细节。在这种情况下,浏览器会看到属性值周围没有引号,然后添加它们:
style=""border:0px""
但在 DOM 检查器中,HTML 字符代码可以正常显示,因此您实际上可以看到:
style=""border:0px""
在 Chrome 中,如果您右键单击并选择编辑 HTML,它会切换回来,以便您可以看到那些讨厌的 HTML 字符代码,从而清楚地表明您有真正的外引号和 HTML 编码的内引号。
所以尝试自己引用的问题是 Razor 逃脱了这些。
如果您想完全控制引号
使用 Html.Raw 防止引号转义:
<td @Html.Raw( someBoolean ? "rel='tooltip' data-container='.drillDown a'" : "" )>
呈现为:
<td rel='tooltip' title='Drilldown' data-container='.drillDown a'>
以上内容非常安全,因为我没有从变量中输出任何 HTML。唯一涉及的变量是三元条件。但是,注意,如果从用户提供的数据构建字符串,最后一种技术可能会使您面临某些安全问题。例如。如果您从源自用户提供的数据的数据字段构建属性,则使用 Html.Raw 意味着该字符串可能包含属性和标记的过早结束,然后开始一个脚本标记,该标记代表当前登录的用户执行某些操作(可能与登录用户不同)。也许您有一个包含所有用户图片列表的页面,并且您正在将工具提示设置为每个人的用户名,并且一个用户将自己命名为'/><script>$.post('changepassword.php?password=123')</script>,现在查看此页面的任何其他用户的密码都会立即更改为恶意用户知道的密码。