Ответ 1
Контроллер создается значительно до того момента, когда вызывается действие индекса, и в момент построения HttpContext действительно недоступен. Что не так, ссылаясь на него в методе контроллера Index
?
Я следую этому учебнику ASP.NET MVC от Microsoft:
Мой код немного отличается, где я пытаюсь получить доступ к HttpContext.Request.IsAuthenticated
в конструкторе контроллера.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
Проблема заключается в том, что HttpContext
всегда null.
Есть ли решение для этого?
Контроллер создается значительно до того момента, когда вызывается действие индекса, и в момент построения HttpContext действительно недоступен. Что не так, ссылаясь на него в методе контроллера Index
?
вместо того, чтобы поместить ваш 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
, но вы сделали то, что вы размещаете метод Action внутри вашего базового контроллера, который является ApplicationController
, поэтому ваш метод Index Index не будет вызван когда вы вызываете любую страницу (страницу индекса), которая не принадлежит ApplicationController.
Я предлагаю вам использовать:
System.Web.HttpContext.Current.Request
Просто помните, что System.Web.HttpContext.Current
является threadstatic, но если вы не используете дополнительный поток, это решение работает.
Решение этой проблемы заключается в создании метода переопределения Initialize путем передачи объекта 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;
}
}
}