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,和TimeID(自动更新)和 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();
    }

结果: