Как сохранить перенос строки из Textarea?

212
15 июля 2018, 05:20

Есть форма блога для поста: Название статьи и тело поста.

@using (Html.BeginForm("PostSave", "Account", FormMethod.Post))
{
    @Html.TextAreaFor(x => x.Headline, new { @id= "tw", cols = "40", rows = 
 "2" })
    <br />
    <br />
    @Html.TextAreaFor(x => x.BodyText, new { @id = "bw", cols = "40", rows = 
"10" })
    <br />
    <br />
    <input id="Submit1" class="btn btn-default" type="submit" value="Пост" />
}

Далее при нажатии кнопки вызывается метод в контроллере:

 public async Task<IActionResult> PostSave(Post model)
    {
        db2.Post.Add(new Post { Headline = model.Headline, BodyText = 
 model.BodyText});
        await db2.SaveChangesAsync();
        return View("~/Views/Home/Blog.cshtml");
    }

Далее при загрузке DOM-дерева автоматом работает код JQuery:

<script type="text/javascript">
   function getData(data) {
    var url = "/api/Blog"
    $.getJSON(url, function (data) {
        $("#idfirst").before('<div id="post" class="post">' +
            '<div id = "posthead" class= "posthead"></div >' +
            '<div id="postbody" class="postbody"></div></div >');
        $("#posthead").append('<p>' + data[6] + '</p>');
        $("#postbody").append('<p>' + data[7] + '</p>');
    });
}

$(document).ready(function () {
    getData();
})

Тут всё просто – перед блоком idfirst вставляем подготовленный блок со вложенными блоками для поста, со своими стилями. Тут всё работает. Но проблема в том, что он не сохраняет перенос на след строку.

Так я его вбил: Так я его вижу:

Как это исправить?

Answer 1

Замените в JavaScript:

data[7]

на:

data[7].split('\n').join('<br>')

Либо на:

data[7].split('\n').join('</p><p>')

Дополнение:

Хотя это не входит в ответ на вопрос, но всё же важно – как заметил пользователь Qwertiy: в данных может оказаться произвольный код и поэтому для безопасности лучше записать так:

$("#posthead").append($('<p>').text(data[6].split('\n').join('<br>')));
$("#postbody").append($('<p>').text(data[7].split('\n').join('<br>')));

Либо же, если использовать CSS-свойство white-space для #postheadи #postbody со значениями:

white-space: pre, white-space: pre-line или white-space: pre-wrap

то данные из ответа сервера в соответствии с вышеупомянутой безопасностью можно вставлять и так:

$("#posthead").append($('<p>').text(data[6]));
$("#postbody").append($('<p>').text(data[7]));
Answer 2

Перевод строки и так на месте, но стили ему не соответствуют.
Используй white-space: pre-line или white-space: pre-wrap для отображения.

$("#posthead").append('<p>' + data[6] + '</p>');

Нельзя так делать - это огромная дыра в безопасности, поскольку в данных может оказаться произвольный код.

Можно переписать так:

$("#posthead").append($('<p>').text(data[6]));

или использовать нормальный шаблонизатор, который умеет экранирование.

READ ALSO
Отправить post запрос html

Отправить post запрос html

Отправить запрос методом POST на сторонний сайт, как это сделать правильно, в форме будет 2-3 поля для заполнения, нужно написать скрипт отправления...

239
Как в javascript &ldquo;закрывать&rdquo; div при клике вне этого дива?

Как в javascript “закрывать” div при клике вне этого дива?

При клике по некоторому элементу управления на экране появляется div c текстом подсказокУ дива есть кнопка "закрыть"

228
После JS не работает CSS

После JS не работает CSS

Столкнулся с такой вот проблемойВ скрытом блоке содержаться Slick-slider, после того, как блок активирую, изображения появляются в миниатюрном...

232
ReferenceError: event is not defined

ReferenceError: event is not defined

Вот этот код выдаёт ReferenceError: event is not defined

248