我正在使用asp.net core 1.1和身份3.0。我正在尝试访问 controller 的constructor
中用户登录名的登录名。但是我得到了NullReferenceException
。但是,我可以在控制器的任何操作方法中获取用户名,如下所示。问题:如何在控制器的构造函数中获取用户名,以便可以在控制器的任何操作方法中使用它。似乎我可能必须为此进行某种依赖注入(但这只是一个猜测)。
public class TestController : Controller
{
private ProjNameContext _context;
string selUser = "";
public TestController(ProjNameContext context)
{
_context = context;
selUser = User.Identity.Name; //Here I get error: Object reference not set to an instance of an object.
}
[HttpGet]
public IActionResult TestAction()
{
selUser = User.Identity.Name; //Here the user name (login name) is not null
.....
}
....
}
简而言之,您不能在构造函数(至少不是直接)中这样做,因为它在请求生命周期中还为时过早。您可以使用将值注入某个地方的属性(也许是ViewData
,但我不确定这在核心中是否有效),但是如果真正的目标只是缓存用户名以后以供以后使用,那么我只会创建一种可以做到这一点的方法。您甚至可以将其放入基本控制器类中,以在项目中的任何操作中使用。例如:
public class BaseController : Controller
{
private string _username;
protected string Username
{
get
{
if (_username == null)
{
_username = User.Identity.Name;
}
return _username;
}
}
}
现在,只需使您的控制器从中继承,您就可以自动访问此属性。例如:
public class TestController : BaseController
//^^^^^^^^^^^^^^
{
private ProjNameContext _context;
public TestController(ProjNameContext context)
{
_context = context;
}
[HttpGet]
public IActionResult TestAction()
{
Now you don't need to cache the username yourself as it's done for you.
var username = Username;
//Do something with username
}
}
您可以使用基本控制器,您可以在其中编写自己的方法来登录用户用户名。
public class BaseControler : Controller
{
public string GetUsername()
{
if (User != null)
{
return User.Identity.Name;
}
else if (System.Web.HttpContext.Current.User != null)
{
return System.Web.HttpContext.Current.User.Identity.Name;
}
return string.Empty;
}
}
然后在您的实际控制器中继承了基本控制器,您可以在构造函数中获取用户名。
public class MyController: BaseController
{
private string username;
public MyController()
{
username = GetUsername();
}
}