MVC 5 控制器中 User.Identity.Name 的对象引用错误

Object Reference error for User.Identity.Name in MVC 5 Controller

我想获取当前登录用户的用户名。但是当我使用 User.Identity.Name 时出现以下错误:

System.NullReferenceException. Object reference not set to an instance of an object.

出现错误的代码如下:

UsersConfigurationController qr = new UsersConfigurationController();
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                context.Roles.Add(new Microsoft.AspNet.Identity.EntityFramework.IdentityRole()
                {
                    Name = collection["RoleName"]
                });
                context.SaveChanges();
                qr.singleRoleAddToDb(collection["RoleName"]);
                ViewBag.ResultMessage = "Role created successfully !";
                return RedirectToAction("Create");
            }
            catch
            {
                return View();
            }
        }

执行以下行时出现错误:

qr.singleRoleAddToDb(collection["RoleName"]);

函数 singleRoleAddToDb 驻留在 UserConfigurationController 中,如下所示:

public void singleRoleAddToDb(string rolename)
        {
            UserRoles urls = new UserRoles();
            urls.S1 = rolename;
            urls.S2 = HttpContext.User.Identity.Name;
            urls.N102 = db.Users.Where(x => x.S1 == HttpContext.User.Identity.Name).Single().N102;
            db.UserRoles.Add(urls);
            db.SaveChanges();

        }  

只要行 urls.S2 = HttpContext.User.Identity.Name; 执行调试器就会切换到 Catch 语句并抛出上述错误。 我已经尝试更改配置文件中的身份验证模式:

<authentication mode="Forms" />

还有

<authentication mode="Windows" />

但错误仍在继续。

如果由于某种原因您无法使用调试器来捕获代码并检查变量,您可以尝试这个老技巧...

将以下代码添加到 singleRoleAddToDb 方法的开头以检查究竟什么是 null:

if (HttpContext == null) 
  throw new ArgumentNullException("HttpContext");
if (HttpContext.User == null) 
  throw new ArgumentNullException("HttpContext.User"); 
if (HttpContext.User.Identity == null) 
  throw new ArgumentNullException("HttpContext.User.Identity");

根据最终遗漏的内容,您可能需要将其作为附加参数传递。