簡體   English   中英

在MVC C#網站應用程序中使用的textarea中的換行符

[英]line breaks in textarea used in a MVC C# website app

我在Visual Studio Web Dev中使用ASP.net MVC C#。 我有幾個textareas填充了數據,然后更新到數據庫記錄。

將記錄更新到數據庫時是否可以保存換行符? 我目前在主頁上查看數據,但是如果有人寫了幾段(包括換行符),格式化將會丟失。

如果這不可能沒問題,但只是想問一下是不是。 謝謝。

View頁面上的代碼如下所示:

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

然后我有一個提交表單的按鈕。

處理提交的Controller代碼如下所示:

[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);
    }

並且數據庫的Model代碼如下所示:

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>

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

完整的Update View頁面代碼

@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>

將字段顯示為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>
}

根本不操縱數據。 顯示它時只需將其包裝在<pre> </ pre>中

示例: <pre>@Model.Data</pre>

這將保留回車

前工作正常,但它需要一些“奇怪”的格式。

    <pre>
        @data.para1
    </pre>

這種作品,除了它在@前面的8個空格處縮進第一行(不正確,因為它可能一目了然)

    <pre>
@data.para1
    </pre>

這很好用,但仍然有一些流浪的回報。

<pre>@data.para1</pre>

這似乎是正確的

我不知道保存數據時這很重要 - 我認為它只是用於選擇成員的可視化 ,但嘗試將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; }
}

文本CrLf的換行符是CrLf因此下次它們似乎消失時,內容不會填充到文本框中。 但是,如果您查看HTML源代碼,您會發現它們存在。

但是因為斷行不等於<br/>這將是一個有點混亂。

所以人們正在做的是將CrLf替換為HTML BR,如下所示:

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

如果您在文字區域打開同一個內容再一次,你會看到<br/>換行符的insteed,所以你必須將其轉換回。

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

這是我最終做的事情,我認為它與<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>標簽在上面的答案中提到的那樣顯示出來。

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 })

您的問題可能不在textarea中。 在主頁上顯示輸入時,您是否在預標記中進行輸入? 如果不是,則忽略換行符和格式。

我遇到了類似的情況,需要能夠將整篇文章從MVC3和文本區域添加到數據庫中。 有很多方法你可以解決這個問題,但我發現最簡單的方法就是關閉ValidateInput(如果你向公眾開放,不要這樣做......這可能導致跨站點腳本和各種各樣的惡意,請確保驗證用戶)。

    [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);       
    }    

如果在數據中放置斷點,則應在VStudio中看到換行符的字符('\\ r \\ n')。 你可以用你想要的任何東西替換那個特定的角色(我建議使用Environment.Newline,如果這不是回復到HTML)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM