Apóstrofo de escape al pasar el parámetro en el evento onclick

Paso el nombre de la compañía a un evento onclick. Algunos nombres de compañías tienen apóstrofes en ellos. Agregué ‘.Replace (“‘”, “‘”)’ al campo company_name. Esto permite que el evento onclick se dispare, pero el mensaje de confirmación se muestra como “Jane & # 39; s Welding Company”.

<a href="#" onclick="return Actionclick('', '');" class="fg-button fg-button-icon-solo ui-state-default ui-corner-all">  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; }; }; 

EDITAR El mensaje de confirmación muestra el & # 39; en el mensaje en lugar de ‘. Cuando lo escribí aquí, reemplazó el & # 39; con un ‘. Se agregaron espacios para que eso no ocurra. Quiero saber la mejor manera de pasarlo a mi evento onclick y también mostrarlo correctamente en el mensaje sin hacer reemplazos múltiples (si hay una manera mejor).

Hay dos opciones según lo veo.

  1. Si ajusta los parámetros entre comillas (“) en lugar de apóstrofos / comillas simples (‘), entonces no debería necesitar escaparse en absoluto. La encoding HTML se ocupará de codificar cualquier comilla (si están en la cadena) y la El apóstrofo no será un problema. Sin embargo, como el javascript ya está envuelto entre comillas, tendrá que hacer una barra invertida para evitar las comillas.

    onclick="return Actionclick(\"< %= Url.Action("Activate", new {id = item.company_id}) %>\", \"< %= Html.Encode(item.company1.company_name) %>\");"

  2. La barra invertida escapa al nombre de la compañía ya que solo es la cadena final de JavaScript que necesita el apóstrofo escapado, no el HTML. p.ej:

    onclick="return Actionclick('< %= Url.Action("Activate", new {id = item.company_id}) %>', '< %= Html.Encode(item.company1.company_name.Replace("'", "\\'")) %>');"

Tienes un literal de cadena de JavaScript dentro de un valor de atributo HTML.

Por lo tanto, primero tendría que codificar JS el valor (reemplazando el ' con \' y \ con \\ ), luego HTML-encode. Actualmente estás codificando HTML con el ' (que sería ineficaz, ya que el navegador lo decodificaría de nuevo en un apóstrofo antes de que el motor JS lo viera) … y luego lo codificará en HTML de nuevo, dejándolo literalmente con el significado ' .

Use un codificador JSON para convertir una cadena (o cualquier otro tipo de valor) en un literal de JavaScript.

Sin embargo. Escribir JavaScript en una cadena es una mierda. Hacer un seguimiento de las múltiples capas de escape no es algo en lo que la mente sea buena. Entonces no lo hagas Evite los atributos del controlador de eventos en línea en todo momento. En su lugar, use una secuencia de comandos estática y asigne controladores desde el propio JavaScript, utilizando scripting discreto.

 " title="This action will activate this company's primary company (< %= Server.HTMLEncode(companyName) %>) and all of its other subsidiaries." >   

(Usaré jQuery ya que lo tienes en tus tags 🙂

  

Sin embargo, tenga en cuenta que esto es un abuso de . Las acciones que hacen que un cambio activo en algo nunca se debe enviar, o se debe permitir que se reciban, como una solicitud GET. En su lugar, debe usar un botón que envíe una solicitud POST (ya sea directamente como un formulario o a través de AJAX). (También debería considerar usar los controles incorporados de ASP.NET en lugar de crear plantillas en los valores, para evitar tener que llamar tanto a HTMLEncode ).

Vea este clásico WTF de una manera en que esto puede morderlo.

Me acabo de encontrar esto 5 años después, así que compartiré lo que funcionó para mí.

Echa un vistazo a HttpUtility.JavaScriptStringEncode en MSDN

Puede usar esto para codificar la cadena en el lado del servidor cuando establece el valor de la propiedad. Esto producirá la representación unicode del apóstrofo – “\ u0027” que se puede pasar al JavaScript onclick.

Para el ejemplo original:

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

se convertirá

 "Jane'\u0027s Welding Company" 

Una nota en HttpUtility.JavaScriptStringEncode: puede elegir especificar un booleano para codificar la cadena con comillas dobles (bool addDoubleQuotes). Sin embargo, dado que esta cadena se utilizará como un parámetro para una función de JavaScript, no desea las comillas adicionales.