在控制器的构造函数中访问 HttpContext.Request
-
26-09-2019 - |
题
我正在关注这个 Microsoft 的 ASP.NET MVC 教程:
我的代码略有不同,我试图访问 HttpContext.Request.IsAuthenticated
在控制器的构造函数中。
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
问题是 HttpContext
始终为空。
有针对这个的解决方法吗?
解决方案
在调用索引动作的点之前,该控制器是显着实例化的,并且在构建httpcontext的构建时刻确实不可用。在您的控制器方法中引用它有什么问题 Index
?
其他提示
而不是把你的 HttpContext.Request.IsAuthenticated
在控制器级别,您应该将其放在控制器基类中,该基类将通过 OnActionExecuting() 方法的重写方法在所有控制器中继承。
在你的控制器库中你应该有
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext ctx) {
base.OnActionExecuting(ctx);
ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
}
}
并且所有的 Controller 都应该继承 BaseController 类
public class ApplicationController : BaseController
现在你应该得到 ViewData["IsAuthenticated"]
在您的母版页中。
编辑
通过您提供的链接以及与您所做的事情相关的内容,您的 ApplicationController
是页面控制器,而不是基本控制器。在示例中, ApplicationController
是一个由继承的基本控制器 HomeController
但你所做的是将 Action 方法放置在你的基本控制器中,这是 ApplicationController
因此,当您调用任何非来自 ApplicationController 的页面(索引页面)时,您的 Action Index 方法将不会被调用。
我建议您使用:
System.Web.HttpContext.Current.Request
只记得 System.Web.HttpContext.Current
是线程的,但是如果您不使用其他线程,则解决方案可行。
该问题的解决方案是通过传递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;
}
}
}