Controller的构造函数使用UserManager.FindById(User.Identity.GetUserId())导致错误的处理

由于需要在MVC的布局页中获取登录会员的相关信息,通过查阅资料,发现可以在构造函数中实现,于是在构造函数中写了如下语句:

ViewBag.AdminInfo = UserManager.FindById(User.Identity.GetUserId());
提示:

未将对象引用设置到对象的实例。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。  异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。 源错误: 
行 57:             get
行 58:             {
行 59:                 return _userManager?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
行 60:                 //if (_userManager!=null)
行 61:                 //{

通过输入中间变量发觉HttpContext为null,通过查看发觉这里的HttpContext实际是Controller.HttpContext,本质是HttpContextBase对象。在stackoverflow
中找到一个解决办法:
HttpContextBase httpContextBase
{
  get
  {
    HttpContextWrapper context = new HttpContextWrapper(System.Web.HttpContext.Current);
    return (HttpContextBase)context;
  }
}
修改后但是又报错了,还是未将对象引用设置到对象实例,只不过这次通过分析发现是User.Identity.GetUserId ()的User为null
这次又遇到这种错误,整个人都不好了。怎么一个一个都是Null值啊。不应该是在构造函数中继承类中的各种方法,属性什么的都能用么。查找了
大量的资料才发现,控制器在实例化后还需要初始化操作,否则一些对象的值会为null。比如HttpContext对象,比如这个User对象。

在控制器中添加了初始化方法:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
  base.Initialize(requestContext);
  ViewBag.AdminInfo = UserManager.FindById(User.Identity.GetUserId());

}
ViewBag.AdminInfo的获取从构造函数中挪到这里,等初始化完成再进行相应的赋值操作。这次在编译运行,没问题了。可以正常执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值