разрывы строк в текстовой области, используемые в веб-приложении MVC C # - PullRequest
24 голосов
/ 23 марта 2012

Я использую ASP.net MVC C # в 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>

Ответы [ 9 ]

37 голосов
/ 23 марта 2012

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

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

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

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

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

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

или

<code>@foreach (var data in Model)
{
    <div class="display-field">
        <pre>
            @data.para1
        
}
9 голосов
/ 16 июля 2012

Не манипулируйте данными вообще. Когда вы отображаете его, просто оберните его в



Пример: @Model.Data

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

3 голосов
/ 04 марта 2014

Предварительно работает нормально, НО требует некоторого "нечетного" форматирования.

<code>    <pre>
        @data.para1
    

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

<code>    <pre>
@data.para1
    

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

<code><pre>@data.para1

Кажется, это в самый раз .

3 голосов
/ 23 марта 2012

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

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

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

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

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

string contentToEdit = fromDatabase.replace("<br/>",Environment.NewLine)
3 голосов
/ 23 марта 2012

Я не знаю, что имеет значение, когда сохраняет данные - я предполагаю, что он просто используется для выбора визуализации члена, но попробуйте переместить ваш атрибут 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; }
}
2 голосов
/ 26 октября 2015

Вот что я в итоге сделал, что, по-моему, в основном совпадает с тегом <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>.

0 голосов
/ 26 апреля 2016
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 })
0 голосов
/ 23 марта 2012

Я столкнулся с подобной ситуацией, когда мне нужно было добавить целую статью в базу данных из 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
0 голосов
/ 23 марта 2012

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

...