Mostrar cadena como html en la vista asp.net mvc

98

Tengo un controlador que genera una cadena que contiene marcas html. Ahora, cuando lo muestro en las vistas, se muestra como una cadena simple que contiene todas las etiquetas. Intenté usar el ayudante Html para codificar / decodificar para mostrarlo correctamente, pero no funciona.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

En mis puntos de vista,

@Html.Encode(str)
Mukesh Sharma
fuente
6
Supongo que Html.Rawdebería ayudar.
Saeed Neamati
También creo que puedes usar la HtmlStrinclase, como enHtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati

Respuestas:

168

Estás cerca quieres usar @Html.Raw(str)

@Html.Encodetoma cadenas y asegura que todos los caracteres especiales se manejen correctamente. Estos incluyen caracteres como espacios.

Jared
fuente
6
@ Html.Raw es exactamente lo que estaba buscando, gracias por la respuesta :)
AFract
IHtmlString como lo menciona @Jerad Rose es mucho mejor
Pratyush Dhanuka
37

Deberías estar usando en su IHtmlStringlugar:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

Siempre que tenga propiedades de modelo o variables que necesiten contener HTML, creo que esta es generalmente una mejor práctica. Primero que nada, es un poco más limpio. Por ejemplo:

@Html.Raw(str)

Comparado con:

@str

Además, también creo que es un poco más seguro que usarlo @Html.Raw(), ya que la preocupación de si sus datos son HTML se mantiene en su controlador. En un entorno en el que tiene desarrolladores de front-end frente a desarrolladores de back-end, sus desarrolladores de back-end pueden estar más en sintonía con los datos que pueden contener valores HTML, manteniendo esta preocupación en el back-end (controlador).

Generalmente trato de evitar el uso Html.Raw()siempre que sea posible.

Otra cosa que vale la pena señalar, es que no estoy seguro de dónde está asignando str, pero algunas cosas que me preocupan sobre cómo puede implementar esto.

Primero, esto debe hacerse en un controlador, independientemente de su solución ( IHtmlStringo Html.Raw). Debería evitar cualquier lógica como esta en su opinión, ya que realmente no pertenece allí.

Además, debería usar su ViewModelpara obtener valores para su vista (y nuevamente, idealmente usar IHtmlStringcomo tipo de propiedad). Ver algo como @Html.Encode(str)es un poco preocupante, a menos que esté haciendo esto solo para simplificar su ejemplo.

Jerad Rose
fuente
1
Me gustaría señalar que los controladores son para enrutamiento y no para almacenamiento de datos. Además, sus desarrolladores de back-end deberían saber mejor que nunca cambiar el contrato existente del código. La interfaz de usuario debe estar vinculada a un modelo, y si el modelo cambia drásticamente, sus pruebas unitarias deberían romperse.
Anthony Mason
Gracias por tu respuesta. Me gusta.
Thomas.Benz
Sí, esta respuesta es mucho mejor, inicialmente usé Html.Raw, pero cuando leí esta respuesta,
cambié de
7

puedes usar @Html.Raw(str)

Consulte MSDN para obtener más información

Devuelve el marcado que no está codificado en HTML.

Este método envuelve el marcado HTML mediante la clase IHtmlString, que genera HTML sin codificar.

AthibaN
fuente
1

Tuve un problema similar con los campos de entrada HTML en MVC. La web paginada solo mostraba la primera palabra clave del campo. Ejemplo: campo de entrada: "El zorro marrón rápido" Valor mostrado: "El"

La resolución fue poner la variable entre comillas en la declaración de valor de la siguiente manera:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
Roland Gales
fuente
0

Tuve un problema similar recientemente, y Google me trajo aquí, así que puse esta respuesta aquí en caso de que otros también lleguen aquí, para completar.

Me di cuenta de que cuando tenía html mal formateado , en realidad me estaban quitando todas mis etiquetas html , y solo quedaba el contenido sin etiquetas . En particular, tenía una tabla con una etiqueta de tabla de apertura faltante, y luego todas mis etiquetas html de toda la cadena se arrancaron por completo.

Entonces, si lo anterior no funciona, y todavía te estás rascando la cabeza, también verifica que tu html sea ​​válido.

Me doy cuenta de que incluso después de que lo hice funcionar, MVC estaba agregando etiquetas tbody donde no tenía ninguna. Esto me dice que se está realizando una limpieza (MVC 5), y que cuando no puede suceder, elimina todas / algunas etiquetas.

Greg
fuente