在MVC Web应用中删除ASP.NET Identity用户时遇404错误求助
解决ASP.NET MVC删除用户时出现404错误的问题
首先得说,你遇到的404问题根源有两个,咱们一个个拆解:
- 请求类型不匹配:
@Html.ActionLink生成的是GET请求,但你的DeleteConfirmed方法标记了[HttpPost]特性——GET请求根本访问不了Post方法,这是核心问题。 - 路由匹配问题:默认MVC路由规则是
{controller}/{action}/{id},你直接通过ActionLink访问DeleteConfirmed这个action名,虽然方法存在,但不符合常规删除流程的设计逻辑,路由也没做特殊配置的话就会找不到资源。
解决方案一:修正视图,用表单发起Post请求
把原来的ActionLink换成表单提交,因为删除是写操作,必须用Post(遵循REST规范,也能避免误点触发删除):
<td> @Html.ActionLink("Edit", "Edit", new { id = user.UserId }) | @using (Html.BeginForm("DeleteConfirmed", "ManageUsers", new { id = user.UserId }, FormMethod.Post)) { @Html.AntiForgeryToken() <!-- 和控制器的[ValidateAntiForgeryToken]对应,防止CSRF攻击 --> <input type="submit" value="Delete" style="border:none; background:none; color:blue; text-decoration:underline; cursor:pointer;" onclick="return confirm('确定要删除该用户吗?');" /> } </td>
这里把按钮样式改成和链接一致的样子,用户体验和原来的ActionLink没差别,但发起的是Post请求,能正确命中你的DeleteConfirmed方法。
解决方案二:优化控制器方法,遵循MVC最佳实践
ASP.NET MVC的删除流程通常是「GET请求显示确认页面 → POST请求执行删除」,你可以调整控制器代码让它更规范:
// GET: 显示删除确认页面 public async Task<ActionResult> Delete(string id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var user = await UserManager.FindByIdAsync(id); if (user == null) { return HttpNotFound(); } return View(user); // 返回包含用户信息的确认删除视图 } // POST: 执行删除操作,用ActionName让路由匹配"Delete" [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<ActionResult> DeleteConfirmed(string id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var user = await UserManager.FindByIdAsync(id); if (user == null) { return HttpNotFound(); } // 批量移除用户的登录关联 var logins = await UserManager.GetLoginsAsync(id); foreach (var login in logins) { await UserManager.RemoveLoginAsync(id, login); } // 批量移除用户角色,比循环单个移除更高效 var userRoles = await UserManager.GetRolesAsync(id); if (userRoles.Any()) { await UserManager.RemoveFromRolesAsync(id, userRoles.ToArray()); } // 执行删除 await UserManager.DeleteAsync(user); return RedirectToAction("Index"); }
对应的视图可以调整为先跳转到Delete的GET页面确认,再提交删除,这样对用户更友好。
额外提醒
- 你代码里用到的事务是正确的,能保证删除操作的原子性,避免出现部分删除成功的异常情况。
- 记得给
UserManager和context做好依赖注入(如果还没做的话),避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Questieme
相关产品推荐
相关产品推荐

