我在ASP.NET MVC应用程序中有一个ControllerBase
类。其他控制器继承自ControllerBase
。
我想访问HttpContext.User.Identity.Name
,但HttpContext
是null
。怎么了?
public ControllerBase()
{
var dataManager=new DataManager();
if (HttpContext.User.Identity.IsAuthenticated) // throws error
{
ViewData["assets"] = ud.BalanceFreeze + ud.Balance + ud.BalanceRealty;
ViewData["onaccount"] = ud.Balance;
ViewData["pending"] = ud.BalanceFreeze;
ViewData["inrealty"] = ud.BalanceRealty;
}
答案 0 :(得分:11)
尝试在ControllerBase中将此代码添加到此事件中:
protected override void Initialize(RequestContext requestContext){
}
答案 1 :(得分:5)
您的控制器在ASP.NET设置HttpContext之前构建。就像Nik说的那样,你需要把这个代码放在你班上的重写方法中。
我还要指出,直接依赖于HttpContext将无法在任何扩展此类的控制器上执行单元测试。这就是ControllerBase
类中的许多方法(如Execute方法)将RequestContext
作为参数的原因。你可以说:
protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
var currentUser = requestContext.HttpContext.User;
...
}
...这使得可以使用“假”上下文创建和执行控制器以进行单元测试。