ASP.NET MVC下使用复合主键生成@Html.ActionLink编辑链接失败如何解决?
复合主键场景生成ActionLink的正确处理方式
你之前拼接主键的方式不生效的核心原因是:后台Edit方法默认需要匹配独立的主键参数,拼接后的单个字符串无法对应到数据库的两个主键字段做查询。
方案1(推荐):直接传递两个主键参数
前端视图代码调整
把ActionLink的路由参数直接传入两个主键字段,不需要封装为单个id:
@Html.ActionLink("Edit", "Edit", new { PoNo = Model.PoNo, ItemNo = Model.ItemNo })
生成的链接会自动携带两个参数,格式类似 /你的控制器名/Edit?PoNo=xxx&ItemNo=yyy
后端控制器代码调整
修改Edit动作的入参,直接接收两个主键字段即可:
public ActionResult Edit(int PoNo, int ItemNo) { // 用两个主键匹配查询对应记录 var targetItem = db.po_items.FirstOrDefault(i => i.PoNo == PoNo && i.ItemNo == ItemNo); if (targetItem == null) { return HttpNotFound(); } return View(targetItem); }
这个方案不需要额外做字符串拼接拆分,逻辑最直观,也不容易出格式错误。
方案2(特殊场景用):约定分隔符拼接为单个id
如果你的路由规则要求必须用单个id参数,可以用固定分隔符(比如下划线、中划线,不要用容易和数字混淆的字符)拼接两个主键值:
前端代码
@Html.ActionLink("Edit", "Edit", new { id = $"{Model.PoNo}_{Model.ItemNo}" })
后端代码
拿到id后拆分出两个主键值即可:
public ActionResult Edit(string id) { var keyParts = id.Split('_'); if (keyParts.Length != 2 || !int.TryParse(keyParts[0], out int poNo) || !int.TryParse(keyParts[1], out int itemNo)) { return HttpNotFound(); } var targetItem = db.po_items.FirstOrDefault(i => i.PoNo == poNo && i.ItemNo == itemNo); return View(targetItem); }
内容的提问来源于stack exchange,提问作者GG6565
相关产品推荐
相关产品推荐

