我正在构建一个主详细信息页面 - 即具有单个主记录的多个详细信息记录。
但是数据库中只保存了一条详细记录。
我尝试调试并发现细节循环仅获取一次值,即使 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 操作方法只保存一行。 标题和详细信息的模型类设置如下。 尝试了博客中的许多解决方案,但没有运气。任何帮助将不胜感激
这是 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>