我在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>
==========================================
@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>
答案 0 :(得分:35)
当将字段显示为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>
}
答案 1 :(得分:9)
根本不操纵数据。当您显示它时,只需将其包装在&lt; pre&gt;&lt; / pre&gt;
中示例:<pre>@Model.Data</pre>
这将保留回车
答案 2 :(得分: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; }
}
答案 3 :(得分:3)
前作品很好,但它需要一些“奇怪的”格式。
<pre>
@data.para1
</pre>
这种作品,除了它将第一行缩进到@前面的8个空格(不正确,因为它可能一目了然)
<pre>
@data.para1
</pre>
效果很好,但仍有一些迷路。
<pre>@data.para1</pre>
这似乎恰到好处。
答案 4 :(得分:2)
文本框内的换行符为CrLf
,因此下次看起来消失时,内容不会填充到文本框中。但是,如果您查看HTML源代码,您会发现它们存在。
但是因为换行符不等于<br/>
,所以会有点混乱。
所以人们正在做的是将CrLf
替换为HTML BR,如下所示:
string ContentToDatabase = input.replace(Environment.NewLine, "<br/>")
如果您再次在textarea中打开相同的内容,则会看到<br/>
有关换行的内容,因此您必须将其转换回来。
string contentToEdit = fromDatabase.replace("<br/>",Environment.NewLine)
答案 5 :(得分:2)
这是我最终做的事情,我认为它与<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>
标记的答案中提到的那样显示。
答案 6 :(得分:0)
您的问题可能不在textarea中。在主页上显示输入时,您是否在预标记中进行输入?如果没有,则忽略换行符和格式。
答案 7 :(得分:0)
我遇到了类似的情况,需要能够将整篇文章从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
答案 8 :(得分:0)
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 })