ASP.NET CRUD 主详细信息仅保存单个详细信息行

问题描述 投票:0回答:1

我正在构建一个主详细信息页面 - 即具有单个主记录的多个详细信息记录。

但是数据库中只保存了一条详细记录。

我尝试调试并发现细节循环仅获取一次值,即使 csthml 页面具有动态输入控件。

这是我的保存方法代码:

using Microsoft.AspNetCore.Mvc;
using TestApplication_timesheet.Data;
using TestApplication_timesheet.Models;

namespace TestApplication_timesheet.Controllers
{
    public class TimeSheetController : Controller
    {
        private readonly ApplicationDbContext _context;

        public TimeSheetController(ApplicationDbContext context )
        {
            _context = context;
        }

        public IActionResult Index()
        {
            List<TimeSheetHeader> timeSheetHeader = _context.TimeSheetHeader.ToList();
            return View(timeSheetHeader);
        }
        public IActionResult Create() 
        { 
            TimeSheetHeader timeSheetHeader=new TimeSheetHeader();

                timeSheetHeader.TimeSheetDetails.Add(new TimeSheetDetails() { Id = 1 });

            return View("Create", timeSheetHeader);
        }
        [HttpPost]
        public IActionResult Create(TimeSheetHeader timesheetheader)
        {

                _context.TimeSheetHeader.Add(timesheetheader);

                // Iterate through TimeSheetDetails and save each explicitly
                foreach (var detail in timesheetheader.TimeSheetDetails)
                {
                    _context.TimeSheetDetails.Add(detail); // Ensure TimeSheetHeaderId is set
                }

                _context.SaveChanges();


                return RedirectToAction("Index");

        }
    }
}

期望将多个详细信息行保存到数据库中。 create 操作方法只保存一行。 标题和详细信息的模型类设置如下。 尝试了博客中的许多解决方案,但没有运气。任何帮助将不胜感激

javascript asp.net-mvc asp.net-core master-detail
1个回答
0
投票

这是 CSHTML @model TestApplication_timesheet.Models.TimeSheetHeader

@{ ViewData["标题"] = "创建"; }

创建

TimeSheetHeader


详情
员工 全部小时数 添加 @for (int i = 0; i < Model.TimeSheetDetails.Count; i++) { @Html.EditorFor(x => x.TimeSheetDetails[i].ContractEmployeeId, new { htmlAttributes = new { @class = "表单控制" } }) @Html.EditorFor(x => x.TimeSheetDetails[i].TotalHrs, new { htmlAttributes = new { @class = “表单控制” } }) 删除 }

        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-primary" />
        </div>
    </form>
</div> </div>

@节脚本{ @{ 等待 Html.RenderPartialAsync("_ValidationScriptsPartial"); } } 函数添加项目(btn){ 变量表; 表 = document.getElementById('employeestable'); var rows = table.getElementsByTagName('tr'); var rowOuterHtml = rows[rows.length - 1].outerHTML;

    var lastrowIdx = rows.length = 2;

    var nextrowIdx = eval(lastrowIdx) + 1;

    rowOuterHtml = rowOuterHtml.replaceAll('_' + lastrowIdx + '_', '_' + nextrowIdx + '_');
    rowOuterHtml = rowOuterHtml.replaceAll('[' + lastrowIdx + ']', '[' + nextrowIdx + ']');
    rowOuterHtml = rowOuterHtml.replaceAll('_' + lastrowIdx + '_' + nextrowIdx);

    var newRow = table.insertRow();
    newRow.innerHTML = rowOuterHtml;

    var x = document.getElementsByTagName("INPUT");

    for (var cnt = 0; cnt < x.length; cnt++) {
        if (x[cnt].type == "text" && [cnt].id.indexOf('_' + nextrowIdx + '_') > 0)
            x[cnt].value = '';
        else if (x[cnt].type == "number" && [cnt].id.indexOf('_' + nextrowIdx + '_') > 0)
            x[cnt].value = 0;
    }

}

function DeleteItem(btn) {

    var table = document.getElementById('employeestable');
    var rows = table.getElementsByTagName('tr');

    if (rows.length == 2) {
        alert("This Row Cannot Be Deleted");
        return;
    }
    $(btn).closest('tr').remove();
} </script> 
© www.soinside.com 2019 - 2024. All rights reserved.