web-dev-qa-db-ja.com

MVC C#Webサイトアプリで使用されるtextareaの改行

Visual Studio Web DevでASP.net MVC C#を使用しています。データが入力され、データベースレコードに更新されるテキストエリアがいくつかあります。

レコードがデータベースに更新されるときに改行を保存することは可能ですか?現在、ホームページでデータを表示していますが、現時点では、誰かがいくつかの段落(改行を含む)を書いた場合、フォーマットは失われます。

これが問題ない場合は問題ありませんが、問題があるかどうかを尋ねたいだけです。ありがとう。

[表示]ページのコードは次のようになります。

<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>
24
Harry

フィールドを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>
}
38
jrummell

データを操作しないでください。表示するときは、単に<pre> </ pre>でラップします

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

これにより、キャリッジリターンが保持されます

9
Kevin

saving dataの場合、それが重要であることはわかりません-メンバーのvisualizationを選択するためだけに使用されると仮定しますが、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; }
}
3
D Stanley

Preは正常に機能しますが、「奇妙な」フォーマットが必要です。

    <pre>
        @data.para1
    </pre>

@

    <pre>
@data.para1
    </pre>

これはうまく機能しますが、まだいくつかの迷子のリターンがあります。

<pre>@data.para1</pre>

これはちょうどいいのようです。

3
Greg Little

テキストボックス内の改行はCrLfであるため、コンテンツは次回失効するように思われるときにテキストボックスに入力されません。ただし、HTMLソースを調べると、それらが存在することがわかります。

しかし、改行は<br/>と等しくないため、少し混乱するでしょう。

したがって、人々がしているのは、次のようにCrLfをHTML BRに置き換えることです。

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

Textareaで同じコンテンツを再度開くと、<br/>改行が挿入されているため、元に戻す必要があります。

string contentToEdit = fromDatabase.replace("<br/>",Environment.NewLine)
3
Simon Edström

私がやったことは、基本的に<pre>タグ、ただしいbootstrap書式設定(境界線、オフホワイトの背景色、奇妙なフォントスタイルなど)なし)

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> 鬼ごっこ。

2
Sum None

これで同様の状況に陥りました。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')が表示されます。これにより、特定の文字を任意の文字に置き換えることができます(HTMLにポストバックしない場合は、Environment.Newlineをお勧めします)。

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

あなたの問題はおそらくテキストエリアにないでしょう。入力をホームページに表示するときに、preタグ内で入力しますか?そうでない場合、改行と書式設定は無視されます。

0
user653649
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
Hemant Ramphul