У вас есть строковый литерал JavaScript внутри значения атрибута HTML.
Таким образом, вам необходимо сначала 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
.)
См. этот классический WTF , чтобы узнать, как это может вас укусить.