ASP.NET Core MVC UI实现CRUD时双主键下编辑删除页失效如何解决
解决方案
你的问题确实来自联合主键的适配,默认MVC脚手架只支持单主键逻辑,按以下步骤修改即可:
1. 调整Controller中对应Action的参数与查询逻辑
脚手架默认生成的Details/Edit/Delete的GET方法只接收单个id参数,需要修改为接收联合主键的两个字段,同时调整EF查询逻辑:
// 以Delete的GET方法为例,Edit和Details同理修改 public async Task<IActionResult> Delete(int? poNo, int? itemNo) { // 两个主键参数都不能为空 if (poNo == null || itemNo == null) { return NotFound(); } // FindAsync按联合主键定义的顺序传入两个值即可查询到对应实体 var poItem = await _context.PoItems.FindAsync(poNo, itemNo); if (poItem == null) { return NotFound(); } return View(poItem); }
对应POST的Delete/Edit方法也可以同步调整参数逻辑,确保能正确匹配到实体。
2. 修改Index.cshtml中的操作跳转链接
默认脚手架生成的操作链接只传了id路由参数,需要改为同时传递两个主键字段:
<!-- 原脚手架生成的链接类似这样 --> <!-- <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> --> <!-- 修改为如下格式,Details、Delete链接同步修改 --> <td> <a asp-action="Edit" asp-route-poNo="@item.PoNo" asp-route-itemNo="@item.ItemNo">编辑</a> | <a asp-action="Details" asp-route-poNo="@item.PoNo" asp-route-itemNo="@item.ItemNo">详情</a> | <a asp-action="Delete" asp-route-poNo="@item.PoNo" asp-route-itemNo="@item.ItemNo">删除</a> </td>
3. 修复页面标签错误(可选,解决排版异常问题)
你贴出的Delete.cshtml中PoNo、ItemNo的展示标签配对错误,都用了<dt>标签,应该把值对应的标签改为<dd>,和后面ProductNo的格式一致即可:
<dt class="col-sm-2"> @Html.DisplayNameFor(model => model.PoNo) </dt> <dd class="col-sm-10"> @Html.DisplayFor(model => model.PoNo) </dd> <dt class="col-sm-2"> @Html.DisplayNameFor(model => model.ItemNo) </dt> <dd class="col-sm-10"> @Html.DisplayFor(model => model.ItemNo) </dd>
修改完成后重新运行项目,即可正常跳转操作页面,完成CRUD操作。
内容的提问来源于stack exchange,提问作者GG6565
相关产品推荐
相关产品推荐

