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 ответов
есть два варианта как я это вижу.
-
Если вы обернете параметры в кавычки ( ") вместо апострофов/одинарных кавычек ( ' ), то вам не нужно будет избегать его вообще. Кодировка HTML позаботится о кодировании любых кавычек (если они находятся в строке), и апостроф не будет проблемой. Хотя, поскольку javascript уже завернут в кавычки, вам нужно будет избежать обратной косой черты ваших кавычек. например:
onclick="return Actionclick(\"<%= Url.Action("Activate", new {id = item.company_id}) %>\", \"<%= Html.Encode(item.company1.company_name) %>\");"
-
обратная косая черта избегает названия компании, поскольку это только последняя строка 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-кодирование его снова, оставляя его буквально значение '
.
используйте кодировщик 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, дополнительные кавычки не нужны.