在onclick事件中传递参数时转义撇号

时间:2010-05-17 00:14:09

标签: jquery html asp.net-mvc parameters apostrophe

我将公司名称传递给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("'", "&#39;")) %>');" 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事件的最佳方法,并且还可以在消息中正确显示它而不进行多次替换(如果有更好的方法)。

3 个答案:

答案 0 :(得分:13)

我认为有两种选择。

  1. 如果你用参数(“)而不是撇号/单引号(')包装参数,那么你根本不需要转义它.HTML编码将负责编码任何引号(如果它们是在字符串中)和撇号不会是一个问题。虽然,因为javascript已经用引号括起来,你需要反斜杠来逃避引号。例如:

    onclick="return Actionclick(\"<%= Url.Action("Activate", new {id = item.company_id}) %>\", \"<%= Html.Encode(item.company1.company_name) %>\");"

  2. 反斜杠转义公司名称,因为它只是需要撇号的最终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编码,使其保持字面意义&#39;

使用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函数的参数,因此您不需要额外的引号。