2011-03-11 2 views
18

Я использую следующее, чтобы текст выводил разрывы строк, введенные в HTML-элемент <textarea>.display line breaks asp.net mvc razor

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

Есть ли более хороший способ сделать это?

+0

Я действительно не вижу, как этот помощник выводит любую разрыву строки, когда вы заменяете разрывы строк пробелом. –

+0

@Darin - плохая копия/вставка с моей стороны, обновлена. – raklos

+0

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

ответ

22

Ваш код уязвим для атак XSS, поскольку он не кодирует текст HTML. Я бы рекомендовал вам следующее:

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

, а затем на ваш взгляде, вы можете спокойно:

@Html.SomeHelper() 
0

Возможно, вы можете вывести текст внутри тега <pre>.

54

Там еще лучших/удивительное решение, которое использует CSS white-space property:

С помощью этого можно избежать Cross-site scripting (XSS) ...

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

W orks как шарм с движком ASP.NET MVC Razor.

+2

Это должен быть фактически принятый ответ. Потому что op попросит лучше! – rjso

0

Это работает для меня.

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

строка Model.Text, имеющие тег < бр /> внутри.

+1

Это доступно для атаки XSS. Поместите '' в вас 'Model.Text', и у вас есть вул. – trailmax

0

Это мое решение.

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

и, конечно же, вам придется добавить следующую инструкцию, чтобы Regex работал.

@using System.Text.RegularExpressions 

Надеюсь, это полезно для кого-то.