Razor页面删除Panel后传递ClientId至Edit Client页面遇空值异常
解决方案
1. 修复删除视图的参数传递
在Delete Panel的视图页面(比如Delete.cshtml)中,添加隐藏字段存储关联的ClientId,确保提交删除请求时能把这个ID传给后台:
@model YourApp.Models.Panel <form asp-action="Delete"> <input type="hidden" asp-for="Id" /> <!-- 新增隐藏字段传递ClientId --> <input type="hidden" asp-for="ClientId" /> <div class="form-group"> <p>确定要删除这个Panel吗?</p> <input type="submit" value="删除" class="btn btn-danger" /> <a asp-action="Edit" asp-controller="Client" asp-route-id="@Model.ClientId" class="btn btn-secondary">取消</a> </div> </form>
如果Panel模型未直接暴露ClientId,也可以通过导航属性获取:asp-route-clientId="@Model.Client.Id"
2. 调整后台删除动作的跳转逻辑
在Panel的Controller中,修改Delete的Post方法,删除成功后显式传入ClientId跳转回Edit Client页面:
[HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteConfirmed(int id) { var panel = await _context.Panel.Include(p => p.Client).FirstOrDefaultAsync(m => m.Id == id); if (panel == null) { return NotFound(); } _context.Panel.Remove(panel); await _context.SaveChangesAsync(); // 直接从panel实例获取关联的ClientId,显式跳转回Client的Edit页面 return RedirectToAction("Edit", "Client", new { id = panel.ClientId }); }
关键是不要依赖上下文自动传递参数,必须明确指定id = panel.ClientId,确保跳转时携带有效的ClientId。
3. 验证模型关联配置
确认Panel模型中正确配置了与Client的外键关联:
public class Panel { public int Id { get; set; } // 确保外键字段存在 public int ClientId { get; set; } // 导航属性,方便获取关联的Client public Client Client { get; set; } // 其他Panel属性... }
如果未配置ClientId外键,EF可能无法正确关联数据,导致删除时无法获取对应的ClientId。
内容的提问来源于stack exchange,提问作者MelB
相关产品推荐
相关产品推荐

