Избегайте апострофа при передаче параметра в событии onclick - PullRequest
8 голосов
/ 17 мая 2010

Я передаю название компании на событие onclick. У некоторых названий компаний есть апострофы. Я добавил '.Replace ("'", "'") "в поле company_name. Это позволяет запускать событие onclick, но сообщение о подтверждении отображается как «Сварочная компания Джейн».

<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;
    };
};

EDIT Сообщение подтверждения показывает «в сообщении, а не». Когда я набрал его здесь, он заменил «на». Добавлены пробелы, чтобы этого не случилось. Я хочу знать, как лучше всего передать его в событие onclick, а также правильно отобразить его в сообщении, не делая многократных замен (если есть лучший способ).

Ответы [ 3 ]

13 голосов
/ 17 мая 2010

На мой взгляд, есть два варианта.

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

2 голосов
/ 17 мая 2010

У вас есть строковый литерал JavaScript внутри значения атрибута HTML.

Таким образом, вам необходимо сначала 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.)

См. этот классический WTF , чтобы узнать, как это может вас укусить.

1 голос
/ 06 августа 2015

Я только что столкнулся с этим 5 лет спустя, поэтому я поделюсь тем, что сработало для меня.

Извлечение HttpUtility.JavaScriptStringEncode в MSDN

Вы можете использовать это для кодирования строки на стороне сервера при установке значения свойства. Это создаст Unicode-представление апострофа - "\ u0027", которое можно передать в JavaScript-клик.

Для исходного примера:

item.company1.company_name = HttpUtility.JavaScriptStringEncode("Jane's Welding Company");

станет

"Jane'\u0027s Welding Company"

Примечание к HttpUtility.JavaScriptStringEncode - вы можете указать логическое значение для кодирования строки двойными кавычками (bool addDoubleQuotes). Однако, поскольку эта строка будет использоваться в качестве параметра функции JavaScript, вам не нужны дополнительные кавычки.

...