由于需要在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的获取从构造函数中挪到这里,等初始化完成再进行相应的赋值操作。这次在编译运行,没问题了。可以正常执行