2011-03-11 77 views
18

Estoy usando lo siguiente para hacer que el texto muestre los saltos de línea ingresados ​​en un elemento HTML <textarea>.Mostrar salto de línea asp.net mvc razor

MvcHtmlString.Create(Model.Post.Description.Replace(Environment.NewLine, "<br />")) 

¿Existe alguna forma más sencilla de hacerlo?

+0

Realmente no veo cómo este helper genera saltos de línea ya que está reemplazando saltos de línea con un espacio. –

+0

@Darin - copiar/pegar pobre de mi parte, actualizado. – raklos

+0

dup http://stackoverflow.com/questions/5032097/asp-net-mvc-convert-n-new-line-to-html-breaks – BlackTigerX

Respuesta

22

Su código es vulnerable a los ataques XSS ya que no codifica HTML para el texto. Yo le recomendaría lo siguiente:

var result = string.Join(
    "<br/>", 
    Model.Post.Description 
     .Split(new[] { Environment.NewLine }, StringSplitOptions.None) 
     .Select(x => HttpUtility.HtmlEncode(x)) 
); 
return MvcHtmlString.Create(result); 

y luego en su vista en la que puede de manera segura:

@Html.SomeHelper() 
0

Tal vez pueda dar salida al texto dentro de una etiqueta <pre>.

54

Hay una solución aún mejor/más impresionante que emplea CSS white-space property:

El uso de este a evitar Cross-site scripting (XSS) vulnerabilidades ...

<p style="white-space: pre-line">@Model.Message</p> 

W Ofrece un encanto con el motor ASP.NET MVC Razor.

+2

Esta debería ser, de hecho, la respuesta aceptada. ¡Porque el operador pide una manera más agradable! – rjso

0

Me funciona.

<p class="message"> 
@Html.Raw("<p>" + Model.Text + "</p>") 
</p> 

cadena Model.Text tener < br> tag/interior.

+1

Eso está abierto al ataque XSS. Coloque '' en usted 'Model.Text' y usted tiene un vuln. – trailmax

0

Aquí está mi solución.

@MvcHtmlString.Create(Regex.Replace(Html.Encode(Model.Address), Environment.NewLine, "<br />", RegexOptions.Multiline)) 

y, por supuesto, tendrá que agregar la siguiente declaración de uso para que Regex funcione.

@using System.Text.RegularExpressions 

Espero que sea útil para alguien.