2012-08-20 22 views
6

Me he estado rascando sobre esto por unos días, y no estoy seguro de si es un problema con mi entorno o el código en sí mismo basándome en ser ASP .NET MVC (aunque tengo 5 años de experiencia en C#). Estoy utilizando una instalación limpia reciente de Win7x64 y VS 2008 con todos los parches.ASP.NET MVC Pasar HTML sin procesar desde el Controlador a la Vista

Tengo HTML sin formato almacenado en una tabla de base de datos que el controlador carga selectivamente en función de unas pocas reglas sobre las que no tengo control. Por desgracia, cuando intento de rellenar el valor en una vista de datos en el control, como por ejemplo:

ViewData["HTMLData"] = DAO.HTMLDataGet(); 

Cuando veo la salida, se escapó/HTML codificado. He intentado utilizar el siguiente todo lo cual no pareció resolver este problema:

<%: HttpUtility.HtmlDecode(ViewData["HTMLData"].ToString())%> 

Y ...

<%: Server.HtmlDecode(ViewData["HTMLData"].ToString())%> 

Y ...

<%: Html.Raw(ViewData["HTMLData"].ToString())%> 

... Se agarra el HTML sin procesar de la tabla de la base de datos está bien, pero sigue forzando esa maldita codificación independientemente de lo que intento. Por lo que leí en MSDN, había una nota al pie sobre los problemas resultantes de que HTML no se decodificara correctamente y que tuviera espacios (lo que hace el mío). Como dudo que soy el único que se ha enfrentado a esto, recurro a ustedes, amigos, para obtener algunas ideas.

Estoy a punto de Kludge a pesar de que con una expresión regular en la vista para hacer la limpieza de la página, pero pensé que sería mejor obtener algunos consejos de otras personas antes de que la fuerza bruta. Gracias de antemano.

+0

¿El contenido es todo html que debe devolverse a la vista? – bhuvin

+0

Creo que he resuelto el misterio. Estaba usando <%: %> en lugar de <%= %> - este último resuelve el problema. Para Microsoft, tratando de hacer las cosas más fáciles, han tomado muchísimas decisiones tontas con ASP.Net como esta y otras pseudo marcado inútiles – Dave

+0

Usando lo que 111Eleven – Oleg

Respuesta

12

<%:significa "codificar si es necesario". Si usted no quiere que, a continuación, el perezoso enfoque sería utilizar <%=, pero francamente yo te sugeriría lugar envolverlo en IHtmlString, por ejemplo:

string yourEncodedHtml = ... 
var html = new MvcHtmlString(yourEncodedHtml); 

Ahora, si almacena que y muéstralo, debería tomar el html "tal como está".

+0

Gracias por explicar por qué esa solución funciona ... simplemente francamente tonto, lo configuraron de esa manera. – Dave

+2

@ user1611050 er, ¿por qué? Prácticamente cada vez que saca algo, lo * correcto * es codificarlo. Ahora piense cuál es el impacto si lo * equivoca *: la doble codificación es ** mucho ** preferible (y mucho más obvio) que un exploit xss. –

8

Probar usando: <% =%>

<%= Html.Raw(ViewData["HTMLData"].ToString())%> 

<%:%> es Sintaxis de salida HTML Codificación en ASP.NET 4 (y ASP.NET MVC)

For More Details

Cómo HTML Codificar contenido Hoy

Las aplicaciones ASP.NET (especialmente las que usan ASP.NET MVC) a menudo se basan en el uso de <% =%> expresiones de código-nugget para generar resultados. Los desarrolladores de hoy a menudo utilizan los métodos de ayuda Server.HtmlEncode() o HttpUtility.Encode() dentro de estas expresiones para codificar HTML el resultado antes de que se represente.

Aunque esto funciona bien, hay dos desventajas de que:

Es un poco prolijos desarrolladores a menudo se olvidan de llamar al método Server.HtmlEncode - y no hay manera fácil de verificar su uso a través de una aplicación

nueva <%:%> código pepita sintaxis

con ASP.NET 4 estamos introduciendo una nueva sintaxis de expresión de código ( <%:%>) que representa un resultado como <% =%> bloques do, pero que también lo codifica HTML automáticamente antes de hacerlo. Esto elimina la necesidad de codificar explícitamente el contenido en HTML.

Elegimos la sintaxis <%:%> para que sea fácil reemplazar rápidamente instancias existentes de <% =%> bloques de código. También le permite buscar fácilmente su base de código para elementos <% =%> para encontrar y verificar cualquier caso en el que no esté usando codificación HTML dentro de su aplicación para asegurarse de tener el comportamiento correcto.

+0

Si llama a 'HtmlRaw', entonces no importa si usa' <%: 'versus' <% = ', y por lo tanto la preferencia seguiría siendo para' <%: '. Si la primera línea era '<%: Html.Raw (...)%>' esta sería la respuesta perfecta a la pregunta. –

Cuestiones relacionadas