Escape-Апостроф при передаче параметра в событии onclick

Я передаю название компании событию onclick. В некоторых названиях компаний есть апострофы. Я добавил:Заменить("'", "'")' на поле имя_компании. Это позволяет событию onclick срабатывать, но сообщение подтверждения отображается как "сварочная компания Джейн".

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

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

3 ответов


есть два варианта как я это вижу.

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


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

поэтому вам нужно будет сначала JS-кодировать значение (заменяя ' С \' и \ С \),затем HTML-кодирование. В настоящее время вы HTML-кодируете ' (что было бы неэффективно, так как браузер декодировал бы его обратно в Апостроф, прежде чем двигатель JS увидел его)... и затем HTML-кодирование его снова, оставляя его буквально значение &#39;.

используйте кодировщик JSON, чтобы превратить строку (или любой другой тип значения) в литерал JavaScript.


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

проверить методу HttpUtility.JavaScriptStringEncode на MSDN

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

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

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

будет стать

"Jane'\u0027s Welding Company"

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