2010-05-17 24 views
8

Estoy pasando el nombre de la compañía a un evento onclick. Algunos nombres de compañías tienen apóstrofes en ellos. Agregué '.Replace ("'", "'") al campo nombre_empresa. Esto permite que el evento onclick se dispare, pero el mensaje de confirmación aparece como "Jane & # 39; s Welding Company".Escape apóstrofo al pasar el parámetro en el evento 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; 
    }; 
}; 

EDITAR El mensaje de confirmación de la muestra & # 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).

+0

Tal vez estoy siendo tonto, pero ¿cuál es la pregunta específica aquí? ¿No quieres el 'en el mensaje de confirmación o quieres' '? – griegs

+0

Whoops. Ver editar. – RememberME

Respuesta

12

Hay dos opciones como yo lo veo.

  1. Si envuelve los parámetros entre comillas (") en lugar de apóstrofes/comillas simples ('), entonces no debería tener que escapar de ella en absoluto. Codificación HTML se encargará de codificar las comillas (si están en la cadena) y los del apóstrofe no será un problema, sin embargo, como el javascript ya está envuelto entre comillas, se necesitará una barra invertida sus cotizaciones por ejemplo:..

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

  2. Backslash escapar de la nombre de la compañía, ya que solo es la cadena final de JavaScript que necesita el apóstrofo escapado, no el HTML. Por ejemplo:

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

+0

Me perdí el escape de la barra invertida en el n. ° 2. Editado –

+0

¡Muchas gracias! ¡Solo me ayudó con mi problema! – Jenski

2

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

Así que tendría que primero JS a codificar el valor (en sustitución del ' con \' y \ con \\), a continuación, la codificación HTML. Actualmente está codificando en HTML 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 &#39;.

Utilice 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.

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

(Voy a usar jQuery ya lo tiene en sus etiquetas :)

<script type="text/javascript"> 
    $('.dangerous').click(function() { 
     return confirm(this.title+' Continue?'); 
    }); 
</script> 

Sin embargo, tenga en cuenta que este es un abuso de <a>. 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 ASP.Los controles incorporados de NET en lugar de crear plantillas en los valores, para evitar tener que llamar al HTMLEncode tanto.

Consulte this classic WTF para una manera en que esto puede morderlo.

1

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

Salida HttpUtility.JavaScriptStringEncode en MSDN

Usted puede usar esto para codificar la cadena en el lado del servidor al establecer el valor de la propiedad. Esto producirá la representación unicode del apóstrofo - "\ u0027" que se puede pasar al JavaScript onclick.

Por ejemplo original:

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

se convertirá en

"Jane'\u0027s Welding Company" 

Una nota sobre HttpUtility.JavaScriptStringEncode - Usted puede optar por especificar un valor lógico para codificar la cadena con comillas dobles (addDoubleQuotes bool) Sin embargo, dado que esta cadena se utilizará como un parámetro para una función de JavaScript, no desea las comillas adicionales.

Cuestiones relacionadas