使用 asp.net 身份更新用户角色

2023-11-22

我有以下问题。在使用下面的代码更改用户的当前角色时,我收到一条异常消息,如下所示:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public virtual ActionResult Edit(User user, string role)
    {
        if (ModelState.IsValid)
        {
            var oldUser = DB.Users.SingleOrDefault(u => u.Id == user.Id);
            var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
            var oldRoleName = DB.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;
            if (oldRoleName != role)
            {
                Manager.RemoveFromRole(user.Id, oldRoleName);
                Manager.AddToRole(user.Id, role);
            }
            DB.Entry(user).State = EntityState.Modified;

            return RedirectToAction(MVC.User.Index());
        }
        return View(user);
    }

附加“Models.Entities.User”类型的实体失败,因为同一类型的另一个实体已具有相同的主键值。如果图表中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

有人知道解决这个问题的好方法吗?


问题是您的管理器和数据库不使用相同的 DbContext。因此,当您将用户从数据库上下文发送到管理器时,它会将其视为“新”用户 - 然后您无法将其从角色中删除。你有两种方法可以到达这里。最简单的方法是从您的经理处获取用户。

[HttpPost]
[ValidateAntiForgeryToken]
public virtual ActionResult Edit(User user, string role)
{
    if (ModelState.IsValid)
    {
        // THIS LINE IS IMPORTANT
        var oldUser = Manager.FindById(user.Id);
        var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
        var oldRoleName = DB.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;

        if (oldRoleName != role)
        {
            Manager.RemoveFromRole(user.Id, oldRoleName);
            Manager.AddToRole(user.Id, role);
        }
        DB.Entry(user).State = EntityState.Modified;

        return RedirectToAction(MVC.User.Index());
    }
    return View(user);
}

更优雅的方法是开始使用像 AutoFac 这样的 DI 框架(https://code.google.com/p/autofac/wiki/MvcIntegration)并将您的 DbContext 设置为 InstancePerApiRequest。

builder.RegisterType<YourDbContext>().As<DbContext>().InstancePerApiRequest();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 asp.net 身份更新用户角色 的相关文章

  • 在 asp.net mvc 3 中使用 Last-Modified 标头和 OutputCacheAttribute 进行客户端缓存

    Edited 我想在客户端缓存图像 并且知道在 mvc 3 中有不同的方法可以做到这一点 如果我错了 请纠正我 1 你可以使用OutputCacheAttribute其工作原理是Expireshttp 标头 但它会回来304 Not Mod
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa
  • HttpContext 中需要什么才能允许 FormsAuthentication.SignOut() 执行?

    我正在尝试为我们的注销方法编写一个单元测试 除其他外 它FormsAuthentication SignOut 然而 它抛出一个System NullReferenceException 我创建了一个模拟 HttpContext 使用起订量
  • 当前上下文中不存在名称“DefaultAuthenticationTypes”

    我正在尝试在我的 Web 应用程序中实现基于角色的授权 如下所示 HttpPost ActionName Login public ActionResult Login LoginViewModel model if ModelState
  • 为什么布尔变量总是重置为 false;

    我在类的顶部声明了一个布尔变量 当在页面上选择单选按钮时 该变量将设置为 true 但是当重新加载页面时 该变量将重置回 false 我处理这个问题的一种方法是使用 static 关键字 但我不确定这是否是处理这个问题的最佳方法 这是我尝试
  • 我们可以将哪些类型的对象放置在视图状态中?

    我想知道为什么我们必须设置可序列化属性才能将对象保存在视图状态 另外 我们可以在视图状态中存储哪种类型的对象 ViewState使用二进制序列化进行序列化对象状态格式化程序 http msdn microsoft com en us lib
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • 如何从编译中排除 ASP.NET 网站代码隐藏文件?

    我正在重构一堆 ASP NET 页面 我想编译并测试我已经完成的那些 但是 Visual Studio 不允许我在非重构页面上运行存在编译错误的网站 如何暂时排除它们而不将它们从项目本身中删除 您可以通过某种配置来做到这一点吗 在 Visu
  • 在 ASP.NET MVC 2 中使用 name="array_name[]" 作为表单元素发布数组

    再会 在 PHP 中 可以使用方括号将 name 属性分配给输入元素 如下所示 name my value PHP 会在服务器端自动将其转换为数组 这在 ASP NET MVC 中可能吗 如果没有 是否有其他方法可以在 ASP NET MV
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • Web请求编码问题

    您好 我遇到以下代码的编码问题 有什么想法吗 string url http www google com ig api weather istanbul TR hl tr HttpWebRequest request WebRequest
  • 多行有多个提交按钮,我应该为每个按钮制作一个表单吗?

    我列出了大约 20 行 每行代表一个订单 每行需要有 3 个按钮 每个按钮单击将执行不同的操作 我有 3 个操作来处 理每个按钮发布请求 我只是不确定如何为每个按钮设置 Html 表单 tr td td tr
  • 如何将 Ajax.BeginForm MVC 助手与 JSON 结果一起使用?

    我正在尝试使用 ASP NET MVC Ajax BeginForm 帮助程序 但不想在调用完成时使用现有的内容插入选项 相反 我想使用自定义 JavaScript 函数作为回调 这可行 但我想要的结果应该以 JSON 形式返回 不幸的是
  • 使用 .net 3.5 和 C# 检测 Chrome

    好的 我正在使用此代码来检测浏览器 使用 chrome 时 它 给我浏览器 苹果MAC Safari 我需要它说 chrome Ater 环顾四周 我发现了这个 Google Chrome Safari 相同的浏览器名称和版本 https
  • 相当于 C# 中的 $_FILES

    C 中 PHP 的 FILES 变量相当于什么 或者至少以相同的方式访问文件 我有一个无法更改的上传表单 需要了解如何获取这些文件 看一眼Request Files 例如 foreach HttpPostedFile item in Req
  • 哈希密码如何解密? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在我的网站中使用盐技术的 SHA1 算法对密码进行哈希处理 有什么办法可以解密密码并恢复原来的密码吗 Hashing不加密 解密 当我们
  • 将 aspx 文件加载到 xmldocument 中

    我希望能够将 aspx 页面加载到 XmlDocument 变量中 我怎么做 这是我尝试过的 它期望 xml 文件而不是 aspx 页面 有没有办法将aspx页面即时转换为xml文档并加载它 谢谢 string filePath C Web
  • 异步代码无需等待完成

    我目前遇到 IIS 崩溃的问题 并在事件日志中留下以下消息 它们对于引导我找到错误的实际来源并没有太大帮助 但一些研究表明这只是生成任务但不等待结果的情况 当它们最终完成时 如果父进程已完成 则无法完成与导致空引用异常的父线程关联 那是对的
  • MVC Html.Partial 或 Html.Action

    我是 ASP NET MVC 新手 所以请耐心等待 我需要构建一个在多个视图中重复的菜单 什么可以更好地服务于目的Html Action http msdn microsoft com en us library ee703423 aspx
  • 正则表达式仅允许特定数字

    我正在寻找一个只允许输入特定数字的正则表达式 例如2 4 5 6 10 18 我尝试过类似的东西 2 4 5 6 10 18 我输入的任何内容都无法通过正则表达式 然后计算机用手指着我并大笑 我哪里出错了 单引号是不必要的 您正在寻找的正则

随机推荐