首页 > 解决方案 > 在 MVC Web 应用程序中删除 ASP.NET 标识的问题

问题描述

因此,在四处寻找有关如何删除 ASP 用户的指南和教程后,我发现以下代码非常简洁:

 [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> DeleteConfirmed(string id)
    {
        if (ModelState.IsValid)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var user = await UserManager.FindByIdAsync(id);
            var logins = user.Logins;
            var rolesForUser = await UserManager.GetRolesAsync(id);

            using (var transaction = context.Database.BeginTransaction())
            {
                foreach (var login in logins.ToList())
                {
                    await UserManager.RemoveLoginAsync(login.UserId, new UserLoginInfo(login.LoginProvider, login.ProviderKey));
                }

                if (rolesForUser.Count() > 0)
                {
                    foreach (var item in rolesForUser.ToList())
                    {
                        // item should be the name of the role
                        var result = await UserManager.RemoveFromRoleAsync(user.Id, item);
                    }
                }

                await UserManager.DeleteAsync(user);
                transaction.Commit();
            }

            return RedirectToAction("Index");
        }
        else
        {
            return View();
        }
    }

我的观点是这样的: 在此处输入图像描述

<td>
    @Html.ActionLink("Edit", "Edit", new { id = user.UserId }) |
    @Html.ActionLink("Delete", "DeleteConfirmed", new { id = user.UserId })
</td>

在这里点击“删除”后,理论上应该是从名为“ManageUsersController”的控制器中调用了DeleteConfirmed方法。但是,它返回此错误:

“/”应用程序中的服务器错误。

无法找到该资源。

说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。

请求的 URL:/ManageUsers/DeleteConfirmed/29ad177f-0285-43d2-b065-109876f270b9

这里可能出了什么问题?还有另一种方法可以在控制器中编写方法吗?先感谢您

标签: c#asp.netasp.net-mvc

解决方案


这个答案基于 .NET 为我们搭建的默认代码。

  • 您正在Delete使用扩展生成链接,该扩展ActionLink需要链接文本作为第一个参数,动作名称作为第二个参数。你的DeleteConfirmed行动是一种POST方法;您无法生成指向 POST 的链接,.NET 会看到 GET 链接方法。所以:
<td>
  @Html.ActionLink("Edit", "Edit", new { id = user.UserId }) |
  @Html.ActionLink("Delete", "Delete", new { id = user.UserId })
</td>
  • 确保您的控制器中Delete有另一种方法称为方法。GET

  • 将另一个属性添加到DeleteConfirmed

[ActionName("Delete")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(string id)
{ ... }
  • 如果您需要在单击 时删除用户Delete,则应使用包含用户 ID 和防伪令牌作为隐藏输入的 POST 表单,并使用提交按钮而不是链接。但最好的做法是向用户展示他们正在删除的内容。这就是 .NET 生成两个相关的删除操作的原因;Delete(审查)和DeleteConfirmed(实际删除)。

推荐阅读