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

在MVC Web应用中删除ASP.NET Identity用户时遇404错误求助

解决ASP.NET MVC删除用户时出现404错误的问题

首先得说,你遇到的404问题根源有两个,咱们一个个拆解:

  1. 请求类型不匹配:@Html.ActionLink生成的是GET请求,但你的DeleteConfirmed方法标记了[HttpPost]特性——GET请求根本访问不了Post方法,这是核心问题。
  2. 路由匹配问题:默认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:56:32