Pergunta

Eu tenho um controle de textarea que aceita a entrada. Estou tentando renderizar esse texto a uma visão simplesmente usando:

@Model.commentText

Isso está codificando corretamente quaisquer valores. No entanto, quero substituir os caracteres de quebra de linha por <br /> E não consigo encontrar uma maneira de garantir que as novas tags de BR não sejam codificadas. Eu tentei usar o HTMLString, mas ainda não tive sorte.

Foi útil?

Solução

Use o Propriedade do espaço branco CSS Em vez de se abrir para as vulnerabilidades do XSS!

<span style="white-space: pre-line">@Model.CommentText</span>

Outras dicas

Experimente o seguinte:

@MvcHtmlString.Create(Model.CommentText.Replace(Environment.NewLine, "<br />"))

Atualizar:

De acordo com marcind's Comente no esta pergunta relacionada, a equipe do ASP.NET MVC está procurando implementar algo semelhante ao <%: e <%= Para o motor de vista da barbear.

Atualização 2:

Podemos transformar qualquer pergunta sobre a codificação HTML em uma discussão sobre entradas prejudiciais do usuário, mas o suficiente disso já existe.

De qualquer forma, cuide de uma entrada potencial do usuário prejudicial.

@MvcHtmlString.Create(Html.Encode(Model.CommentText).Replace(Environment.NewLine, "<br />"))

Atualização 3 (ASP.NET MVC 3):

@Html.Raw(Html.Encode(Model.CommentText).Replace("\n", "<br />"))

A terceira solução de Omar como auxiliar HTML seria:

public static IHtmlString FormatNewLines(this HtmlHelper helper, string input)
{
    return helper.Raw(helper.Encode(input).Replace("\n", "<br />"));
}

Divida em novas linhas (AGNOSTIC AGNOSTIC) e imprima regularmente - não há necessidade de se preocupar com a codificação ou XSS:

@if (!string.IsNullOrWhiteSpace(text)) 
{
    var lines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var line in lines)
    {
        <p>@line</p>
    }
}

(Remover entradas vazias é opcional)

Aplicando o Princípio seco Para a solução de Omar, aqui está uma extensão HTML Helper:

using System.Web.Mvc;
using System.Text.RegularExpressions;

namespace System.Web.Mvc.Html {
    public static class MyHtmlHelpers {
        public static MvcHtmlString EncodedReplace(this HtmlHelper helper, string input, string pattern, string replacement) {
            return new MvcHtmlString(Regex.Replace(helper.Encode(input), pattern, replacement));
        }
    }
}

Uso (com regex melhorado):

@Html.EncodedReplace(Model.CommentText, "[\n\r]+", "<br />")

Isso também tem o benefício adicional de colocar menos ônus no Razor View Developer para garantir a segurança das vulnerabilidades do XSS.


Minha preocupação com a solução de Jacob é que renderizar a linha quebra com o CSS quebra o Semântica HTML.

Eu precisava dividir algum texto em parágrafos (tags "P"), então criei um ajudante simples usando algumas das recomendações em respostas anteriores (obrigado).

public static MvcHtmlString ToParagraphs(this HtmlHelper html, string value) 
    { 
        value = html.Encode(value).Replace("\r", String.Empty);
        var arr = value.Split('\n').Where(a => a.Trim() != string.Empty);
        var htmlStr = "<p>" + String.Join("</p><p>", arr) + "</p>";
        return MvcHtmlString.Create(htmlStr);
    }

Uso:

@Html.ToParagraphs(Model.Comments)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top