我将公司名称传递给onclick事件。一些公司名称中包含撇号。我将'.Replace(“'”,“'”)'添加到company_name字段。这允许触发onclick事件,但确认消息显示为“Jane& #swings Company”。
<a href="#" onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "'")) %>');" class="fg-button fg-button-icon-solo ui-state-default ui-corner-all"><span class="ui-icon ui-icon-refresh"></span></a>
<script type="text/javascript">
function Actionclick(url, companyName)
{
if (confirm('This action will activate this company\'s primary company ('+companyName+') and all of its other subsidiaries. Continue?'))
{
location.href = url;
};
};
修改 确认消息显示&amp;#39;在消息而不是'。当我在这里打字时,它取代了&amp;#39;用'。添加空格以便不会发生。我想知道将它传递给我的onclick事件的最佳方法,并且还可以在消息中正确显示它而不进行多次替换(如果有更好的方法)。
答案 0 :(得分:13)
我认为有两种选择。
如果你用参数(“)而不是撇号/单引号(')包装参数,那么你根本不需要转义它.HTML编码将负责编码任何引号(如果它们是在字符串中)和撇号不会是一个问题。虽然,因为javascript已经用引号括起来,你需要反斜杠来逃避引号。例如:
onclick="return Actionclick(\"<%= Url.Action("Activate", new {id = item.company_id}) %>\", \"<%= Html.Encode(item.company1.company_name) %>\");"
反斜杠转义公司名称,因为它只是需要撇号的最终javascript字符串,而不是HTML。例如:
onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "\\'")) %>');"
答案 1 :(得分:2)
您在HTML属性值中有一个JavaScript字符串文字。
因此,您需要首先对值进行JS编码(将'
替换为\'
,将\
替换为\\
),然后 HTML编码。目前你正在对'
进行HTML编码(由于浏览器会在JS引擎看到之前将其解码回撇号,因此效果不佳)...然后再次对其进行HTML编码,使其保持字面意义'
。
使用JSON编码器将字符串(或任何其他值类型)转换为JavaScript文字。
然而。用字符串编写JavaScript非常糟糕。跟踪多层逃逸并不是头脑擅长的。所以不要这样做。始终避免使用内联事件处理程序属性。相反,使用静态脚本并使用不显眼的脚本从JavaScript本身分配处理程序。
<a class="dangerous fg-button fg-button-icon-solo ui-state-default ui-corner-all"
href="<%= Server.HTMLEncode(Url.Action("Activate", new {id = item.company_id})) %>"
title="This action will activate this company's primary company (<%= Server.HTMLEncode(companyName) %>) and all of its other subsidiaries."
>
<span class="ui-icon ui-icon-refresh"></span>
</a>
(我将使用jQuery,因为你在标签中有它:)
<script type="text/javascript">
$('.dangerous').click(function() {
return confirm(this.title+' Continue?');
});
</script>
但请注意,这是对<a>
的滥用。作为GET请求,永远不应该发送或允许接收对某些内容进行主动更改的操作。您应该使用提交POST请求的按钮(直接作为表单,或通过AJAX)。 (您还应该考虑使用ASP.NET的内置控件而不是模板化值,以避免必须非常多地调用HTMLEncode
。)
请参阅this classic WTF,了解这可能会让您感到厌烦。
答案 2 :(得分:1)
我刚刚在5年后遇到这个,所以我将分享对我有用的东西。
在MSDN上查看HttpUtility.JavaScriptStringEncode
设置属性值时,可以使用它来编码服务器端的字符串。这将生成撇号的unicode表示 - “\ u0027”,可以将其传递给JavaScript onclick。
原始示例:
item.company1.company_name = HttpUtility.JavaScriptStringEncode("Jane's Welding Company");
将成为
"Jane'\u0027s Welding Company"
关于HttpUtility.JavaScriptStringEncode的注释 - 您可以选择指定一个布尔值来使用双引号对该字符串进行编码(bool addDoubleQuotes)。但是,由于此字符串将用作JavaScript函数的参数,因此您不需要额外的引号。