Pregunta

Me gustaría utilizar algunas etiquetas de servidor dentro de una función Javascript:

<%=Model.HtmlProperty%>

En el pasado se han almacenado este valor en un campo de entrada oculto, pero cuando una propiedad contiene HTML que puedes tener problemas con caracteres especiales como comillas. Me gustaría evitar tener que codificar y decodificar en el controlador para evitar problemas con caracteres especiales.

Rick Strahl tiene una par mensajes sobre este problema en un proyecto de formularios web, pero estoy buscando una solución elegante para un proyecto de MVC.

Actualizar : La respuesta de Robert Harvey sugiere a continuación para codificar el HTML. Una vez más, que no es lo que quiero hacer . En última instancia, estoy tratando de inyectar secuencias de comandos HTML en una instancia fckeditor. Esto se debe hacer en javascript. Estoy tratando de encontrar la manera de acceder al valor de <%=Model.HtmlProperty%> dentro javascript sin almacenar texto codificado en un elemento de entrada oculta.

¿Fue útil?

Solución 2

Parece que lo que estaba esperando a hacer - el uso de etiquetas de servidor dentro de Javascript - no es posible. Yo había estado guardando la cadena dentro de un elemento de entrada oculto, y de acuerdo con el comentario de queen3, parece que voy a tener que seguir haciendo lo que he estado haciendo todo el tiempo. Gracias a todos por sus comentarios.

Otros consejos

Préstamos de puesto de Rick Strahl, y el cambio de la firma llamado un poco, la función para la que codifica una cadena JavaScript (después de su transformación en un método de extensión para la clase HTML) es el siguiente:

public static string EncodeJsString(this HtmlHelper h, string s)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("\"");
    foreach (char c in s)
    {
        switch (c)
        {
            case '\"':
                sb.Append("\\\"");
                break;
            case '\\':
                sb.Append("\\\\");
                break;
            case '\b':
                sb.Append("\\b");
                break;
            case '\f':
                sb.Append("\\f");
                break;
            case '\n':
                sb.Append("\\n");
                break;
            case '\r':
                sb.Append("\\r");
                break;
            case '\t':
                sb.Append("\\t");
                break;
            default:
                int i = (int)c;
                if (i < 32 || i > 127)
                {
                    sb.AppendFormat("\\u{0:X04}", i);
                }
                else
                {
                    sb.Append(c);
                }
                break;
        }
    }
    sb.Append("\"");

    return sb.ToString();
}

¿Qué le debería permitir a llamarlo así:

<%= Html.EncodeJsString(Model.HtmlProperty) %>

Uso HtmlHelper a escribir su guión sobre la marcha ..


public static string WriteLightboxScript(this HtmlHelper helper, string galleryName)
        {
            var builder = new TagBuilder("script");
            builder.MergeAttribute("type", "text/javascript");
            builder.SetInnerText("$(function() {$('a[rel=" + galleryName + "]').lightBox();});");
            return builder.ToString(TagRenderMode.Normal);
        }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top