ASP.NET Core 6.0 MVC:如何将多行文本框文本(值)作为每行的新记录保存到数据库
ASP.NET Core 6.0 MVC : how to save MultiLine TextBox Text (Value) to database as new records for each new line
正如标题所说,我想知道如何从单个 TextBox 中解析出多行文本,然后将这些值中的每一个单独提交到我的数据库。
用户在显示屏上输入表示设施物理位置的条形码,然后他们可以在该位置放置多个植物。因此,与其让他们为每一株植物都提交一份新表格,我认为这是一种更简单的方法。
但是,我很难理解如何在 Create();
的 HttpPost
事件中在我的控制器中实现这一点
传递的信息是:ID, UserId, PlantId, Barcode, Date
,和Time
。 ID
(自动更新)和 PlantId
将是唯一改变的东西。条形码、日期和时间应该是相同的值。我在这里的示例中删除了所有失败的尝试,因此您可以在没有我想要做的情况下看到它是如何工作的。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,PlantId,Barcode,UserId,Date,Time")] VegLocationModel vegLocationModel)
{
if (ModelState.IsValid)
{
_context.Add(vegLocationModel);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Create));
}
return View(vegLocationModel);
}
查看:
@model tester.Models.VegLocationModel
@{
ViewData["Title"] = "Create";
var userName = "TEST";
var currentDate = DateTime.Now.Date.Month.ToString() + "/" + DateTime.Now.Date.Day.ToString() + "/" + DateTime.Now.Date.Year.ToString();
var currentTime = string.Format("{0:hh:mm:ss tt}", DateTime.Now);
Html.Hidden("UserId");
Html.Hidden("Date");
Html.Hidden("Time");
}
<h1>Create</h1>
<h4>VegLocationModel</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Barcode" class="control-label"></label>
<input asp-for="Barcode" class="form-control" style="min-width:100%"/>
<span asp-validation-for="Barcode" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="PlantId" class="control-label"></label>
<textarea asp-for="PlantId" class="form-control" rows="10" cols="50">
</textarea>
<span asp-validation-for="PlantId" class="text-danger"></span>
</div>
<div class="form-group">
<input id="UserId" type="hidden" value="@userName" asp-for="UserId" class="form-control" />
<span asp-validation-for="UserId" class="text-danger"></span>
</div>
<div class="form-group">
<input id="Date" type="hidden" value="@currentDate" asp-for="Date" class="form-control" />
<span asp-validation-for="Date" class="text-danger"></span>
</div>
<div class="form-group">
<input id="Time" type="hidden" value="@currentTime" asp-for="Time" class="form-control" />
<span asp-validation-for="Time" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
在多行文本框中,新行可以分隔为 \r\n(适用于 windows)或 \n\r,具体取决于操作系统。所以,逻辑很简单。只需使用 \n\r 或 \r\n 拆分多行文本框并将其存储在数据库中的单独行中。
您发布到“创建”操作的文本区域的值是字符串类型而不是 int,因此您无法将其与 VegLocationModel 绑定
你可以尝试如下:
[HttpPost]
public IActionResult Create(SomeTest someTest,string plantid)
{
List<int> plantids = plantid.Split("\r\n").Select(m=>Convert.ToInt32(m)).ToList();
return Ok();
}
结果:
尝试如下更新您的数据库:
public async Task<IActionResult> Create(SomeTest someTest)
{
List<string> plantids = someTest.PlantId.Split("\r\n").ToList();
var soemtestlist = new List<SomeTest>();
foreach (var id in plantids)
{
soemtestlist.Add(
new SomeTest(){
Barcode= someTest.Barcode,
Time= someTest.Time,
UserId= someTest.UserId,
PlantId = id
});
}
_context.SomeTest.AddRange(soemtestlist);
await _context.SaveChangesAsync();
return Ok();
}
结果:
正如标题所说,我想知道如何从单个 TextBox 中解析出多行文本,然后将这些值中的每一个单独提交到我的数据库。
用户在显示屏上输入表示设施物理位置的条形码,然后他们可以在该位置放置多个植物。因此,与其让他们为每一株植物都提交一份新表格,我认为这是一种更简单的方法。
但是,我很难理解如何在 Create();
HttpPost
事件中在我的控制器中实现这一点
传递的信息是:ID, UserId, PlantId, Barcode, Date
,和Time
。 ID
(自动更新)和 PlantId
将是唯一改变的东西。条形码、日期和时间应该是相同的值。我在这里的示例中删除了所有失败的尝试,因此您可以在没有我想要做的情况下看到它是如何工作的。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,PlantId,Barcode,UserId,Date,Time")] VegLocationModel vegLocationModel)
{
if (ModelState.IsValid)
{
_context.Add(vegLocationModel);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Create));
}
return View(vegLocationModel);
}
查看:
@model tester.Models.VegLocationModel
@{
ViewData["Title"] = "Create";
var userName = "TEST";
var currentDate = DateTime.Now.Date.Month.ToString() + "/" + DateTime.Now.Date.Day.ToString() + "/" + DateTime.Now.Date.Year.ToString();
var currentTime = string.Format("{0:hh:mm:ss tt}", DateTime.Now);
Html.Hidden("UserId");
Html.Hidden("Date");
Html.Hidden("Time");
}
<h1>Create</h1>
<h4>VegLocationModel</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Barcode" class="control-label"></label>
<input asp-for="Barcode" class="form-control" style="min-width:100%"/>
<span asp-validation-for="Barcode" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="PlantId" class="control-label"></label>
<textarea asp-for="PlantId" class="form-control" rows="10" cols="50">
</textarea>
<span asp-validation-for="PlantId" class="text-danger"></span>
</div>
<div class="form-group">
<input id="UserId" type="hidden" value="@userName" asp-for="UserId" class="form-control" />
<span asp-validation-for="UserId" class="text-danger"></span>
</div>
<div class="form-group">
<input id="Date" type="hidden" value="@currentDate" asp-for="Date" class="form-control" />
<span asp-validation-for="Date" class="text-danger"></span>
</div>
<div class="form-group">
<input id="Time" type="hidden" value="@currentTime" asp-for="Time" class="form-control" />
<span asp-validation-for="Time" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
在多行文本框中,新行可以分隔为 \r\n(适用于 windows)或 \n\r,具体取决于操作系统。所以,逻辑很简单。只需使用 \n\r 或 \r\n 拆分多行文本框并将其存储在数据库中的单独行中。
您发布到“创建”操作的文本区域的值是字符串类型而不是 int,因此您无法将其与 VegLocationModel 绑定 你可以尝试如下:
[HttpPost]
public IActionResult Create(SomeTest someTest,string plantid)
{
List<int> plantids = plantid.Split("\r\n").Select(m=>Convert.ToInt32(m)).ToList();
return Ok();
}
结果:
尝试如下更新您的数据库:
public async Task<IActionResult> Create(SomeTest someTest)
{
List<string> plantids = someTest.PlantId.Split("\r\n").ToList();
var soemtestlist = new List<SomeTest>();
foreach (var id in plantids)
{
soemtestlist.Add(
new SomeTest(){
Barcode= someTest.Barcode,
Time= someTest.Time,
UserId= someTest.UserId,
PlantId = id
});
}
_context.SomeTest.AddRange(soemtestlist);
await _context.SaveChangesAsync();
return Ok();
}
结果: