在控制器的构造函数中访问HttpContext.Request
我正在关注微软的ASP.NET MVC教程 :
我的代码略有不同,我试图访问控制器的构造函数中的HttpContext.Request.IsAuthenticated
。
namespace SCE.Controllers.Application { public abstract class ApplicationController : Controller { public ApplicationController() { bool usuario = HttpContext.Request.IsAuthenticated; } } }
问题是HttpContext
始终为空。
有针对这个的解决方法吗?
控制器在调用Index操作之前显着实例化,并且在构buildHttpContext的时刻确实不可用。 在控制器方法中引用它有什么问题Index
?
而不是把你的HttpContext.Request.IsAuthenticated
在控制器级别上,你应该把它放在控制器基类中,这个控制器类将被OnActionExecuting()方法的覆盖方法inheritance。
在你的Controller基地,你应该有
public class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext ctx) { base.OnActionExecuting(ctx); ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated; } }
所有的控制器都应该inheritanceBaseController类
public class ApplicationController : BaseController
现在你应该在你的母版页中获得ViewData["IsAuthenticated"]
。
编辑
通过你给出的链接,并且关于你所做的事情,你的ApplicationController
是一个页面控制器,而不是一个基本控制器。 在这个例子中, ApplicationController
是一个由HomeController
inheritance的基本控制器,但是你所做的是将Action方法放在你的基本控制器中,这就是ApplicationController
所以当你调用任何页面时你的Action Index方法将不会被调用索引页)不是来自ApplicationController。
我build议你使用:
System.Web.HttpContext.Current.Request
只要记住System.Web.HttpContext.Current
是线程静态的,但如果你不使用额外的线程解决scheme的工作。
这个问题的解决scheme是通过传递RequestContext对象来创build一个重载的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; } } }