9

我将公司名称传递给 onclick 事件。一些公司名称中有撇号。我在 company_name 字段中添加了 '.Replace("'", "'")'。这允许 onclick 事件触发,但确认消息显示为“Jane's Welding 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;
    };
};

编辑 确认消息显示 39; 在消息中而不是 '. 当我在这里输入它时,它取代了 39; 带一个'。添加了空格,这样就不会发生。我想知道将它传递给我的 onclick 事件的最佳方法,并在不进行多次替换的情况下正确地在消息中显示它(如果有更好的方法)。

4

3 回答 3

14

在我看来,有两种选择。

  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("'", "\\'")) %>');"

于 2010-05-17T00:25:41.190 回答
2

您在 HTML 属性值中有一个 JavaScript 字符串文字。

因此,您需要首先对值进行 JS 编码(替换'with\'\with \\),然后进行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太多。)

请参阅这个经典的 WTF,了解它可以咬你的一种方式。

于 2010-05-17T01:08:50.377 回答
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 函数的参数,因此您不需要额外的引号。

于 2015-08-05T22:23:52.753 回答