ASP.NET Core如何实现同页面两个按钮提交同一模型到不同后端方法
实现方案
完全可以实现同页面两个提交按钮传递同一个Model到不同后端方法,下面是最推荐的无JS实现方案:
问题根因
你当前的删除按钮被包裹在<a>标签中,触发的是GET请求,只会携带URL中显式拼接的参数,不会提交当前页面的表单数据,因此后端拿到的Model为空。
具体实现步骤
1. 修改前端代码
将两个提交按钮都放在同一个form标签内部,给删除按钮添加formaction属性指定提交到DeleteUser接口即可,浏览器会自动把当前表单的所有数据提交到对应地址:
@* 你的表单根标签,所有输入控件都要放在这个form内部 *@ @using (Html.BeginForm("Edit", "Account", FormMethod.Post)) { @* 原有页面的所有表单输入、展示内容都保留在这里 *@ @if ((currentUser.IsInRole("SuperAdmin"))) { @* 删除按钮:指定提交路径为DeleteUser *@ <input type="submit" class="btn-glow primary" value="@_stringLocalizer["DELETE"]" formaction="@Url.Action("DeleteUser", "Account")" /> } @* 原有编辑提交按钮,默认提交到form指定的Edit接口 *@ <input type="submit" class="btn-glow primary" value="@_stringLocalizer["AccountEditViewSubmitButtonDisplayName"]" id="submit" /> }
2. 修正后端代码
给DeleteUser方法添加[HttpPost]特性,接收表单POST提交的数据:
[Authorize(Roles = "SuperAdmin")] [HttpPost] // 必须添加,匹配表单的POST提交方式 public async Task<IActionResult> DeleteUser(frontEndModel model) { // 这里的model就能正常获取到前端表单的所有绑定数据 if (model?.user != null) { // 你的删除业务逻辑 _context.Users.Remove(model.user); await _context.SaveChangesAsync(); } return RedirectToAction("UserList"); // 操作完成后跳转对应页面 } [Authorize(Roles = "Admin,GroupAdmin,SuperAdmin")] [HttpPost] public async Task<IActionResult> Edit(frontEndModel model) { // 原有编辑逻辑完全不变 }
注意事项
- 确保你需要传递的Model所有字段,在form内部都有对应的输入控件(可见输入框或者
<input type="hidden" />隐藏控件都可以),否则ASP.NET Core的模型绑定会自动忽略对应字段 - 如果需要删除前二次确认,只需要给删除按钮添加
onclick="return confirm('确认删除该用户?')"即可,不影响表单数据提交
内容的提问来源于stack exchange,提问作者AverageGuyIsaac
相关产品推荐
相关产品推荐

