Подтвердить что ты не робот

Разрывы строк в textarea, используемые в приложении веб-сайта MVC С#

Я использую ASP.net MVC С# в Visual Studio Web Dev. У меня есть пара текстовых полей, которые заполнены данными, а затем обновлены до записи базы данных.

Можно ли сохранить разрывы строк при обновлении записи в базе данных? В настоящее время я просматриваю данные на главной странице, но на данный момент, если кто-то пишет пару абзацев (включая разрывы строк), форматирование будет потеряно.

Если это невозможно, не проблема, а просто спросить, есть ли это. Спасибо.

Код на странице просмотра выглядит следующим образом:

<div class="editor-field">
        @Html.TextAreaFor(model => model.para1, new { cols = 75, @rows = 5 })
        @Html.ValidationMessageFor(model => model.para1)
</div>

Затем у меня есть кнопка, которая отправляет форму.

Код контроллера, обрабатывающий представление, выглядит следующим образом:

[HttpPost]
    public ActionResult Update(Data data)
    {
        if (ModelState.IsValid)
        {
            data.ID = 1; //EF need to know which row to update in the database.
            db.Entry(data).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }
        return View(data);
    }

и код модели для базы данных выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace DFAccountancy.Models
{
    public class Data
    {
        [DataType(DataType.MultilineText)]
        public int ID { get; set; }
        public string para1 { get; set; }
        public string para2 { get; set; }
    }

    public class DataDBContext : DbContext
    {
        public DbSet<Data> Data { get; set; }
    }
}

===========================================

код домашней страницы

@model IEnumerable<DFAccountancy.Models.Data>

@{
    ViewBag.Title = "Index";
}

<h2>
    DF Accountancy
</h2>
<div>

<fieldset>
<legend>About us</legend>

@foreach (data in Model)
{

<table>
    <tr>
        <td rowspan="2" width="50%">
            <b>
                Suspendisse lectus massa, feugiat at cursus ac, sollicitudin a metus.     Quisque adipiscing commodo sem vitae eleifend. 
            Maecenas ante risus, hendrerit ac tempor et, feugiat eu sapien. Sed sem massa, sodales a varius sit amet, porta in 
            turpis. Duis ullamcorper magna sed risus lobortis luctus. Quisque volutpat enim ut erat tristique sit amet posuere 
            sem ullamcorper. Nulla consequat lectus in sapien sagittis cursus. Quisque elit augue, luctus sed semper non, fringilla 
            sed quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce vitae 
            augue quis nisi tincidunt ullamcorper. Duis posuere ultricies turpis at dictum. Vivamus at odio eros. Nunc orci 
            lectus, ornare non tincidunt sed, venenatis id lorem. Nulla ullamcorper, leo quis pellentesque sollicitudin, dui 
            libero vehicula lectus, lobortis consequat orci dui in augue. Ut gravida enim convallis sem luctus sit amet eleifend 
            lorem malesuada. Suspendisse in augue diam, eu laoreet diam.
            </b>
            </td>
            <td>
                <div class="display-field">
                    @Html.Raw(data.para1.Replace(Environment.NewLine, "<br/>"))
                </div>
            </td>
        </tr>
        <tr>    
            <td>
                <div class="display-field">
                    @Html.Raw(data.para2.Replace(Environment.NewLine, "<br/>"))
                </div>
            </td>
        </tr>
</table>
}

        </fieldset>
</div>

==========================================

Полный код страницы просмотра просмотра

@model DFAccountancy.Models.Data

@{
    ViewBag.Title = "Update";
    }



<h2>Update</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">    </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<script type="text/javascript">
    $(function () { $("#cl_button1").click(function () { $("#para1").val(""); }); });
    $(function () { $("#cl_button2").click(function () { $("#para2").val(""); }); });
</script>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Data</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.para1)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.para1, new { cols = 75, @rows = 5 })
        @Html.ValidationMessageFor(model => model.para1)
        <input id="cl_button1" type="button" value="Clear Paragraph" />
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.para2)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.para2, new { cols = 75, @rows = 5 })
        @Html.ValidationMessageFor(model => model.para2)
        <input id="cl_button2" type="button" value="Clear Paragraph" />
    </div>



    <p>
        <input type="submit" value="Update" />
        <input type="reset" value="Re-Set to begining" />
    </p>

</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
4b9b3361

Ответ 1

При отображении поля в виде html он не будет включать разрывы строк, поскольку они рассматриваются как пробелы в разметке HTML. Вы можете заменить их на <br/>. Он будет выглядеть примерно так:

<div class="display-field">
   @Html.Raw(Model.para1.Replace(Environment.NewLine, "<br/>"))
</div>

Или вы можете отобразить его как предварительно отформатированный текст, который сохранит пробел:

<div class="display-field">
    <pre>
        @Model.para1
    </pre>
</div>

Обновить Если ваша модель IEnumerable<T>:

@foreach (var data in Model)
{
    <div class="display-field">
       @Html.Raw(data.para1.Replace(Environment.NewLine, "<br/>"))
    </div>
}

или

@foreach (var data in Model)
{
    <div class="display-field">
        <pre>
            @data.para1
        </pre>
    </div>
}

Ответ 2

Не манипулируйте данными вообще. Когда вы показываете его, просто оберните его в <pre> </pre>

Пример: <pre>@Model.Data</pre>

Это сохранит возврат каретки

Ответ 3

Я не знаю, что это важно при сохранении данных - я предполагаю, что он просто используется для выбора визуализации члена, но попробуйте переместить свой атрибут MultiLineText в поля строки:

public class Data
{
    public int ID { get; set; }
    [DataType(DataType.MultilineText)]
    public string para1 { get; set; }
    [DataType(DataType.MultilineText)]
    public string para2 { get; set; }
}

Ответ 4

Pre работает отлично, НО требуется некоторое "нечетное" форматирование.

    <pre>
        @data.para1
    </pre>

Этот вид работ, кроме того, что он отступает от первой строки на 8 пробелов впереди @(неправомерно, поскольку это может показаться с первого взгляда)

    <pre>
@data.para1
    </pre>

Это хорошо работает, но все же имеет несколько неудачных результатов.

<pre>@data.para1</pre>

Это выглядит как только справа.

Ответ 5

Линейная строка внутри текстового поля CrLf, поэтому содержимое не будет заполнено текстовым полем в следующий раз, когда они, кажется, исчезнут. Однако, если вы посмотрите на источник HTML, вы обнаружите, что они существуют.

Но поскольку разрыв строки не равен a <br/>, он будет немного запутанным.

Так что люди делают это, чтобы заменить CrLf на HTML BR следующим образом:

string ContentToDatabase = input.replace(Environment.NewLine, "<br/>")

Если вы снова откроете один и тот же контент в текстовом поле, вы увидите <br/>, установленный для строк, поэтому вам нужно его вернуть.

string contentToEdit = fromDatabase.replace("<br/>",Environment.NewLine)

Ответ 6

Вот что я в итоге сделал, что, по-моему, в основном такое же, как тег <pre>, но без уродливого форматирования бутстрапа (например, границы, белый цвет фона, странный стиль шрифта и т.д.)

CSS

.multi-line{
   white-space: pre-wrap;
}

Вид:

<div class="multi-line">@Html.DisplayFor(model => model.Description)</div>
<div class="multi-line">@data.para</div>

Убедитесь, что между вашим элементом div и вашим помощником html нет пробелов, или те, которые будут отображаться, как кто-то, упомянутый выше в ответах с тегом <pre>.

Ответ 7

Ваша проблема, вероятно, не в текстовом поле. При отображении ввода на домашней странице вы делаете это в предварительных тегах? Если нет, разрывы строк и форматирование игнорируются.

Ответ 8

Я столкнулся с аналогичной ситуацией с этим, вам нужно иметь возможность добавлять всю статью в базу данных из MVC3 и текстовых областей. Есть много способов, которыми вы могли бы это сделать, но самое простое, что я нашел, это отключить ValidateInput (не делайте этого, если вы открываете это для публики... это может вызвать скрипты на разных сайтах и ​​всевозможные nasties, убедитесь, что вы проверяете пользователей).

    [HttpPost]
    [AuthRole(Role = "Administrator")]  //Created Validataion so inaccessible from outside
    [ValidateInput(false)]      
    public ActionResult Update(Data data)       
    {       
        if (ModelState.IsValid)       
        {       
            data.ID = 1; //EF need to know which row to update in the database.       
            db.Entry(data).State = EntityState.Modified;       
            db.SaveChanges();       
            return RedirectToAction("Index", "Home");       
        }       
        return View(data);       
    }    

Если вы поместите контрольную точку в данные, вы должны увидеть символ новой строки ('\ r\n') в VStudio. Вы можете заменить этот конкретный символ тем, что хотите (я бы предложил Environment.Newline, если это не сообщение в HTML).

                data.dataString = dataString.Replace(@"\r\n", Environment.Newline);
                //Or change Newline to "<br />" if posting to HTML

Ответ 9

public class YourClass
{
    public int Id { get; set; }

    [DataType(DataType.MultilineText)]
    public string paragraph { get; set; }
}

@Html.TextAreaFor(m => m.paragraph, new { @class = "form-control", @rows = 5 })