如何从抽象基本控制器访问 HttpContext?

发布于 2024-08-04 18:42:56 字数 331 浏览 4 评论 0原文

我创建了一个抽象控制器类 (ApplicationController) 来处理一些用户身份验证,但在调用代码时 HttpContext 未初始化。

public abstract class ApplicationController : Controller
{
    public ApplicationController()        
    {
        string myuser = HttpContext.User.Identity.Name; // NullReferenceException
    }
}

I have created an abstract controller class (ApplicationController) for handling some user authentication, but HttpContext is not initialized when the code get called.

public abstract class ApplicationController : Controller
{
    public ApplicationController()        
    {
        string myuser = HttpContext.User.Identity.Name; // NullReferenceException
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

森林很绿却致人迷途 2024-08-11 18:42:56

Yassir 关于在抽象类中使用受保护的构造函数是正确的。但你是对的,它不能解决你的问题——HttpContext 仍然没有完全填充,所以你会得到空引用异常。

不管怎样,解决方案很简单——重写控制器的Initialize方法:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    string myuser = this.User.Identity.Name;
    base.Initialize(requestContext);
}

Yassir is correct about using protected constructors in abstract classes. But you are correct that it doesn't solve your problem--the HttpContext still ain't quite populated yet so you get null reference exceptions.

Anyhow, the solution is simple--override the Initialize method of the controller:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    string myuser = this.User.Identity.Name;
    base.Initialize(requestContext);
}
耳根太软 2024-08-11 18:42:56

尝试使您的 .ctor 受到保护

public abstract class ApplicationController : Controller 
{
    protected ApplicationController()
    {
        string myuser = this.User.Identity.Name;
    } 
}

,并确保您没有错过此 using 指令:

using System.Web.Mvc;

try to make your .ctor protected

public abstract class ApplicationController : Controller 
{
    protected ApplicationController()
    {
        string myuser = this.User.Identity.Name;
    } 
}

also make sure you are not missing this using directive:

using System.Web.Mvc;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文