ASP.NET MVC Razor보기에서 줄 바꿈 문자를 <br />로 바꾸십시오


241

입력을 허용하는 텍스트 영역 컨트롤이 있습니다. 나중에 다음을 사용하여 해당 텍스트를보기로 렌더링하려고합니다.

@ Model.CommentText

이것은 모든 값을 올바르게 인코딩하고 있습니다. 그러나 줄 바꿈 문자를 바꾸고 싶습니다 <br />. 새 br 태그가 인코딩되지 않도록하는 방법을 찾을 수 없습니다. HtmlString을 사용해 보았지만 아직 운이 없었습니다.


1
줄 바꿈이 \n데이터베이스와 같이 저장되어 있다고 가정 하고 <br />?
Marko

예-보기에서 \ n을 <br />로 바꾸려고합니다.
bkaid

답변:


681

XSS 취약성에 노출되지 않고 CSS 공백 속성을 사용하십시오 !

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

9
@Jacob Krall-+1을주기 위해 로그인했습니다. 환상적인 작은 트릭.
Levi Botelho

6
quirksmode.org/css/whitespace.html는 의 좋은 설명이 있습니다 pre-line(I는 알고 있었다 nowrappre).
James Skemp

7
이것에 대해 몰랐습니다. 내 것보다 확실히 더 나은 답변.
Omar

39
공백을 하나의 공백으로 그룹화하면 텍스트가 엉망이 white-space: pre-wrap;되므로 실제로 더 좋습니다 pre-line.
Chtiwi Malek 2016

4
불행히도 이것은 거의 모든 전자 메일 클라이언트 (Office 2013 포함)에서 작동하지 않습니다.
Roger Far

115

다음을 시도하십시오 :

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

최신 정보:

이 관련 질문에 대한marcind's 의견에 따르면 ASP.NET MVC 팀은 Razor 뷰 엔진 과 유사한 것을 구현하려고합니다 .<%:<%=

업데이트 2 :

우리는 HTML 인코딩에 대한 질문을 유해한 사용자 입력에 대한 토론으로 바꿀 수는 있지만 이미 충분히 존재합니다.

어쨌든 잠재적 인 유해한 사용자 입력을 관리하십시오.

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

업데이트 3 (Asp.Net MVC 3) :

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

13
맙소사 내가 몇 가지에 대한 의견을 결정하는 경우 <script>.
Darin Dimitrov

4
고마워-효과가 있었다. 매우 가까웠지만 교체를 너무 빨리 또는 너무 늦게 수행 했어야합니다. Environment.NewLine이 제대로 작동하지 않았기 때문에 @ MvcHtmlString.Create (Html.Encode (Model.CommentText) .Replace ( "\ n", "<br />"))으로 끝났습니다.
bkaid

2
Environment.NewLine 정말 브라우저가 대개 반환 이후 게시물을 형성하기 위해 적용되지 않는 \n대신에\r\n
Buildstarted

20
출시 된 MVC 3 버전의 경우 MvcHtmlString을 사용하는 대신 @ Html.Raw (Html.Encode (Model.CommentText) .Replace (Environment.NewLine, "<br />"))로 제안됩니다. 최소한 디스플레이 용.
James Skemp

2
Environment.NewLine은 "\ r \ n"을 나타냅니다. 사용자가 linux 또는 mac을 사용하여 데이터를 입력 한 경우 줄 바꿈은 "\ n"또는 "\ r"입니다. 어딘가에 이것을 고려하는 방법이 없습니까?
SandRock

11

줄 바꿈 (환경에 구애받지 않음)으로 분할하고 정기적으로 인쇄하십시오-인코딩이나 xss에 대해 걱정할 필요가 없습니다.

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

(빈 항목 제거는 선택 사항입니다)


10

HTML 도우미로서 Omar의 세 번째 솔루션은 다음과 같습니다.

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

5

DRY 원칙 을 Omar의 솔루션에 적용하는 다음 은 HTML 도우미 확장입니다.

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));
        }
    }
}

사용법 (정규식 개선) :

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

또한 XSS 취약성의 보안을 보장하기 위해 Razor View 개발자에게 부담을 덜어주는 이점도 있습니다.


Jacob의 솔루션에 대한 나의 관심은 CSS로 줄 바꿈을 렌더링하면 HTML 의미 가 깨진다는 것 입니다.


4

일부 텍스트를 단락 ( "p"태그)으로 나누어야했기 때문에 이전 답변의 권장 사항 중 일부를 사용하여 간단한 도우미를 만들었습니다 (감사합니다).

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);
    }

용법:

@Html.ToParagraphs(Model.Comments)

0

수동으로 마크 업을하지 않아도되므로이 방법을 선호합니다. Razor Pages를 문자열로 렌더링하고 이메일을 통해 전송하기 때문에 이것을 사용합니다. 이는 공백 스타일이 항상 작동하지 않는 환경입니다.

public static IHtmlContent RenderNewlines<TModel>(this IHtmlHelper<TModel> html, string content)
{
    if (string.IsNullOrEmpty(content) || html is null)
    {
        return null;
    }

    TagBuilder brTag = new TagBuilder("br");
    IHtmlContent br = brTag.RenderSelfClosingTag();
    HtmlContentBuilder htmlContent = new HtmlContentBuilder();

    // JAS: On the off chance a browser is using LF instead of CRLF we strip out CR before splitting on LF.
    string lfContent = content.Replace("\r", string.Empty, StringComparison.InvariantCulture);
    string[] lines = lfContent.Split('\n', StringSplitOptions.None);
    foreach(string line in lines)
    {
        _ = htmlContent.Append(line);
        _ = htmlContent.AppendHtml(br);
    }

    return htmlContent;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.