none
Armar una función JavaScript con StringBuilder RRS feed

  • Pregunta

  • Saludos a todos

    Estoy armando una función de la siguiente manera les adjunto una parte del código:

    public static string RegisterJS(this System.Web.Mvc.HtmlHelper helper, string scriptLib)
            {
                StringBuilder JavaScript = new StringBuilder();
                JavaScript.AppendFormat(@"<script type= ""text/javascript"">{0}", Environment.NewLine);
                JavaScript.AppendFormat(@"var toolbar = new toolBarObject('toolbarObj');{0}", Environment.NewLine);
                JavaScript.AppendFormat(@"            toolbar.disableElements('" + scriptLib + "', true);{0}", Environment.NewLine);
                JavaScript.AppendFormat(@"            toolbar.setIconsPath('/content/imgs/');{0}", Environment.NewLine);
    ...
    ...
                JavaScript.AppendFormat(@"</script>{0}", Environment.NewLine);            
                return JavaScript.ToString();
            }

    Esta función la llamo para que se carga en una aplicación Asp.Net MVC4 dentro de una sección:

    de la siguiente manera:

    @section ToolBar{
       <h2>aqui debo cargar mi javascript</h2>
       @Html.RegisterJS("Personal")
    }

    pero no me despliga bien los caracteres por ejemplo:

    deberia mostrarme de esta forma
    <script type= "text/javascript">
    
    pero al ver el codigo de la página me muestra de esta forma
    &lt;script type= &quot;text/javascript&quot;&gt;
    

    Como puedo solucionar este problema, adjunto una imagen de la vista del código

    • Cambiado webJose miércoles, 28 de noviembre de 2012 2:41 (De:Lenguaje C#)
    martes, 27 de noviembre de 2012 22:32

Respuestas

  • Ricardo, lo único que tiene que cambiar es el tipo que devuelve el Helper y la línea de return:

    public static MvcHtmlString RegisterJS(this System.Web.Mvc.HtmlHelper helper, string scriptLib)
    {
        ...
        return MvcHtmlString.Create(JavaScript.ToString());
    }

    Eso es todo.  Recuerde que razor automáticamente pasa cualquier string por el Encoder de HTML a menos que sea de tipo MvcHtmlString, en cuyo caso la escribe tal y como viene.


    Jose R. MCP
    Code Samples

    • Propuesto como respuesta eduard tomàsMVP miércoles, 28 de noviembre de 2012 11:03
    • Marcado como respuesta ricardo_jal miércoles, 28 de noviembre de 2012 12:45
    miércoles, 28 de noviembre de 2012 2:40
  • Si no quieres usar MvcHtmlString desde el helper hay otra solución. Usar Html.Raw:

    @Html.Raw(Html.RegisterJS("personal"))

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta ricardo_jal miércoles, 28 de noviembre de 2012 12:46
    miércoles, 28 de noviembre de 2012 11:01

Todas las respuestas

  • el tema es que te esta aplciando un encode al texto cuando lo lleva al browser, lo esta intepretando como html

    me pregunto porque no armaste el javascript directo en la pagina, si puede ahcerlo sin problema, para que complicarte la vida

    @section ToolBar{
       <h2>aqui debo cargar mi javascript</h2>
       
       <script type= ""text/javascript"">
    		var toolbar = new toolBarObject('toolbarObj');
    		toolbar.disableElements('" + scriptLib + "', true);
    		toolbar.setIconsPath('/content/imgs/');
    
    
        </script> 
    }

    el script definelo en la vista para que funcione correctamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 27 de noviembre de 2012 22:58
  • Leandro 

    Eso seria lo ideal pero el código lo tengo en un helper que es una dll tengo funciones que son bastante grandes y debo hacer en varias páginas imaginate toda esa cantidad de codigo seria criminal para alguien que lo revise, esto es una manera de simplificar la vista para el developer.

    saludos

    Ricardo

    martes, 27 de noviembre de 2012 23:09
  • El problema está en cómo dejas el html que generas dentro del html. Es decir en que pones donde está el "aquí debo cargar mi javascript"

    Yo esta pregunta la haria en un foro de web, ya que creo que aquí no es el sitio


    @XaviPaper
    http://geeks.ms/blogs/xavipaper

    martes, 27 de noviembre de 2012 23:20
  • ok entiendo es un helper

    lo primero que quitaria del helper es el

    Environment.NewLine

    eso puede traer problemas

    despues como proximo paso dejaria de usar el String.Builder

    Creando HTML Helpers personalizados en ASP.NET MVC 3

    como veras alli usa el @ para ahcer texto multilinea, usa el string.Format()

    y por sobre todo usa el

    TagBuilder Class

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 28 de noviembre de 2012 0:17
  • Pero Leandro, ¿crees que con eso se soluciona el problema? Yo creo que el problema está al pegar el string que de una forma y otra se forma en el helper

    De todas formas yo si puedes evitarlo, no usaria TagBuilder, ya que complica mucho la generación del xml utilizando esas clase... A mi me parece bien la alternativa que él ha escogido del StringBuilder, o la del string.format que comenta Leandro. En ningúna de las dos debe tener ningún problema.

    Mira este post que te puede ayudar mucho ya que resuelve el mismo problema que planteas... http://www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs

    Saludos y espero haberte ayudado


    @XaviPaper
    http://geeks.ms/blogs/xavipaper

    miércoles, 28 de noviembre de 2012 0:36
  • no se si lo soluciona, lo que si veo es que le esta aplciando el encode al texto que sale del helper

    evalua esto

    Custom HtmlHelper Renders Text and not Markup

    alli le sucede lo mismo y utiliza el HtmlString()

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 28 de noviembre de 2012 0:47
  • Por eso creo que el problema está en el ASP/HTML y no en el C#

    @XaviPaper
    http://geeks.ms/blogs/xavipaper

    miércoles, 28 de noviembre de 2012 0:49
  • Ricardo, lo único que tiene que cambiar es el tipo que devuelve el Helper y la línea de return:

    public static MvcHtmlString RegisterJS(this System.Web.Mvc.HtmlHelper helper, string scriptLib)
    {
        ...
        return MvcHtmlString.Create(JavaScript.ToString());
    }

    Eso es todo.  Recuerde que razor automáticamente pasa cualquier string por el Encoder de HTML a menos que sea de tipo MvcHtmlString, en cuyo caso la escribe tal y como viene.


    Jose R. MCP
    Code Samples

    • Propuesto como respuesta eduard tomàsMVP miércoles, 28 de noviembre de 2012 11:03
    • Marcado como respuesta ricardo_jal miércoles, 28 de noviembre de 2012 12:45
    miércoles, 28 de noviembre de 2012 2:40
  • Si no quieres usar MvcHtmlString desde el helper hay otra solución. Usar Html.Raw:

    @Html.Raw(Html.RegisterJS("personal"))

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta ricardo_jal miércoles, 28 de noviembre de 2012 12:46
    miércoles, 28 de noviembre de 2012 11:01
  • webjose, muchas gracias ... como indicas funcionó perfectamente se le agradece mucho
    miércoles, 28 de noviembre de 2012 12:45
  • eduar tomás probe tu sugerencia  .. tambien funciono se le agradece por colaborar
    • Marcado como respuesta ricardo_jal miércoles, 28 de noviembre de 2012 12:46
    • Desmarcado como respuesta ricardo_jal miércoles, 28 de noviembre de 2012 12:47
    miércoles, 28 de noviembre de 2012 12:46