обработка ввода textarea для сохранения абзацев

У меня есть приложение MVC 2.0, которое принимает многострочный ввод из текстовой области, а затем отображает текст в другом месте. Хотелось бы сохранить хотя бы абзацы.

В настоящее время я использую помощник TextArea для формы, затем Html.Encode значение снова, когда я его вывожу.

// form view
<%: Html.TextAreaFor(model => model.Text, new { cols = 80, rows = 20 })%>

// display view
<div><%: Model.block.Text %></div

Одного этого, конечно, недостаточно. Ввод

first line

second line

отображается как

<div>first line

second line</div>

который отображается как «первая строка, вторая строка». Не идеально.

Я понимаю, что я мог бы сам вставить теги p в текст или даже попросить пользователя ввести их. Однако в этом случае мне пришлось бы отключить HtmlEncode для отображаемой страницы, что кажется проблематичным, верно? Неужели нет лучшего способа, чем вручную удалить все теги из текста, затем вызвать HtmlEncode, затем добавить теги p, а затем отключить автоматическое кодирование представлений?

Между прочим, я слышал, что люди на этом форуме ссылаются на редакторы WYSIWYG, такие как TinyMCE, для ввода в текстовую область. Пока не вижу, как это решит проблему. Редактор не собирается выполнять надежную очистку ввода, но снова потребует от меня удалить HtmlEncoding на отображаемой странице. И снова мне пришлось бы писать сложное дезинфицирующее средство с нуля или просто удалять все теги, включая a и image, до тех пор, пока причудливый редактор WYSIWYG не станет совершенно бессмысленным.


person duffy    schedule 14.07.2010    source источник


Ответы (2)


Вы можете закодировать текст в HTML, а затем применить теги <p>

<%= "<p>" + Html.Encode(Model.block.text).Replace("\n", "</p><p>") + "</p>" %>
person ZippyV    schedule 14.07.2010
comment
Это будет работать, хотя это слишком агрессивно для моей цели. Я не хочу прерываться на каждой новой строке, только на каждой пустой новой строке (несколько новых строк). ‹p›первая строка\n вторая строка‹/p›\n \n ‹p›третья строка‹/p›\n Полагаю, это означает, что мне нужна немного более сложная логика сопоставления, ищущая что-то вроде "([\f\r\t\v]*\n){2,}", которое тогда, вероятно, должно быть находится где-то в контроллере или вспомогательном разделе, а не в самом представлении. Я рассмотрю расширение Html.Encode, чтобы принять необязательное значение add_paragraphs. - person duffy; 16.07.2010

Не могли бы вы просто заменить все символы новой строки \n элементами разрыва <br />, используя что-то вроде...

string output = Model.block.Text.Replace ("\n", "<br />");
person Richard JP Le Guen    schedule 14.07.2010
comment
В порядке. Но чтобы получить желаемый эффект, мне придется отключить Html.Encode на отображаемой странице, а это означает, что я должен убедиться, что текст не содержит вредоносного кода. Я что-то упускаю? - person duffy; 14.07.2010
comment
Хммм... Я не так много делал с Asp.NET MVC, поэтому я не уверен в этом :( извините - person Richard JP Le Guen; 14.07.2010