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)
beOnActionExecuting(ActionExecutingContext ctx)
?我相信这篇文章是正确的答案,其余都要遵循最佳实践,个人喜好和手头的任务。我想知道为什么不使用thisAn gotcha为我实现Controller.HttpContext
。将控制器的httpContext属性与httpContext.Current错误可能重复