You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:27:03