Asp.net mvc 访问控制器中的HttpContext.Request';s构造函数

Asp.net mvc 访问控制器中的HttpContext.Request';s构造函数,asp.net-mvc,httpcontext,controllers,Asp.net Mvc,Httpcontext,Controllers,我是这样说的: 我的代码稍有不同,我尝试在控制器的构造函数中访问HttpContext.Request.IsAuthenticated namespace SCE.Controllers.Application { public abstract class ApplicationController : Controller { public ApplicationController() { bool usuario =

我是这样说的:

我的代码稍有不同,我尝试在控制器的构造函数中访问
HttpContext.Request.IsAuthenticated

namespace SCE.Controllers.Application
{
    public abstract class ApplicationController : Controller
    {
        public ApplicationController()
        {
            bool usuario = HttpContext.Request.IsAuthenticated;
        }           
    }
}
问题是
HttpContext
始终为空


是否有解决方案?

而不是将您的
HttpContext.Request.IsAuthenticated
放在控制器级别,您应该将其放在控制器基类中,该基类将通过OnActionExecuting()方法的重写方法在所有控制器中继承

在控制器基座中,您应该具有

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
    }
}
所有控制器都应该继承BaseController类

public class ApplicationController : BaseController
现在您应该在母版页中获得
ViewData[“IsAuthenticated”]

编辑
通过您提供的链接,并与您所做的相关,您的
ApplicationController
是一个页面控制器,而不是基本控制器。在本例中,
ApplicationController
是一个基本控制器,由
HomeController
继承,但您所做的是将动作方法放置在基本控制器中,即
ApplicationController
中,因此在调用任何页面(索引页面)时不会调用动作索引方法这不是来自ApplicationController。

在调用索引操作之前,控制器被实例化,并且在构造HttpContext时确实不可用。在控制器方法
索引中引用它有什么问题?

我建议您使用:

 System.Web.HttpContext.Current.Request

请记住,
System.Web.HttpContext.Current
是threadstatic,但如果不使用附加线程,则解决方案会起作用。

此问题的解决方案是通过传递RequestContext对象来创建初始化的覆盖方法

public class ChartsController : Controller
{
     bool isAuthed = false;
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        if (requestContext.HttpContext.User.Identity.IsAuthenticated)
        {
          isAuthed =true;
        }
    }
}

只有DI就地控制器构造函数才包含代码,通常只有一行_repository=repository我必须将
Public
更改为
Protected
,才能在我的代码中工作,由于错误:重写“受保护”继承成员时无法更改访问修饰符我认为您应该重写
操作执行
,它发生在
操作
代码运行之前,而不是之后发生的
操作执行
,这样您就可以访问
查看数据
(或其他内容)在您的方法中,您似乎覆盖了
OnActionExecuting
,但在实现中调用了
base.OnActionExecuted
。这看起来像是个打字错误。哦,是的。。接得好。。我已将重写的方法更改为
OnActionExecuting
,而不是
onactionexecutive
,并且该部分没有更改。感谢您应该
OnActionExecuting(actionexecutivecontext ctx)
be
OnActionExecuting(ActionExecutingContext ctx)
?我相信这篇文章是正确的答案,其余都要遵循最佳实践,个人喜好和手头的任务。我想知道为什么不使用thisAn gotcha为我实现
Controller.HttpContext
。将控制器的httpContext属性与httpContext.Current错误可能重复