【发布时间】:2017-05-25 03:44:17
【问题描述】:
以下示例代码抛出 NullReferenceException 和消息 Object reference not set to an instance of an object.。该错误指的是User 属性,即null。
基本控制器
public class BaseController : Controller
{
public string UserName
{
get
{
return User.Identity.Name;
}
}
}
家庭控制器
[Authorize]
public class HomeController : BaseController
{
private string username { get; set; }
public HomeController()
{
username = UserName;
}
// GET: Home
public ActionResult Index()
{
ViewBag.UserName = username;
return View();
}
}
另一方面,如果在操作中直接访问UserName 属性,那么它可以正常工作。因此,如果将代码更改为:
家庭控制器
[Authorize]
public class HomeController : BaseController
{
// GET: Home
public ActionResult Index()
{
ViewBag.UserName = this.UserName;
return View();
}
}
任何想法为什么?
更新:
所以,真正的问题是在控制器的构造过程中 HttpContext 不可用。我真的很想知道为什么?有什么解释吗?另外,如果我需要使用构造函数 DI 来实例化一个依赖类,而该依赖类又需要知道当前登录的用户,例如:
[Authorize]
public class HomeController : BaseController
{
private IMyService service;
public HomeController(IMyService service)
{
this.service = service;
this.service.UserName = UserName;
}
// GET: Home
public ActionResult Index()
{
// use service here ...
return View();
}
}
【问题讨论】:
-
Controller类的User属性可能在构造函数运行时尚未设置,但在调用Index()时已设置。 -
关于为什么的任何想法或文档链接?
标签: c# asp.net asp.net-mvc iprincipal