我正在关注此ASP.NET MVC tutorial from Microsoft:
我的代码略有不同,我试图在控制器的构造函数中访问HttpContext.Request.IsAuthenticated
。
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
问题是HttpContext
始终为空。
有解决方法吗?
答案 0 :(得分:101)
而不是将你的HttpContext.Request.IsAuthenticated
置于Controller级别,你应该把它放在Controller Base类中,它将在你的所有控制器中使用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
,这样您的Action当您调用不是来自ApplicationController的任何页面(索引页面)时,将不会调用索引方法。
答案 1 :(得分:48)
我建议你使用:
System.Web.HttpContext.Current.Request
请记住System.Web.HttpContext.Current
是线程静止的,但如果您不使用其他线程,则解决方案可以正常工作。
答案 2 :(得分:9)
Controller在调用Index操作之前显着实例化,并且在构造时HttpContext确实不可用。在控制器方法Index
中引用它有什么问题?
答案 3 :(得分:8)
此问题的解决方案是通过传递RequestContext对象来创建Initialize的覆盖方法。
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;
}
}
}