Я следую этому учебному руководству MVC ASP.NET от Microsoft:
Мой код немного отличается, где я пытаюсь получить доступ HttpContext.Request.IsAuthenticated
в конструкторе контроллера.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
Проблема - это HttpContext
является всегда пустым.
Существует ли решение этого?
Контроллер инстанцируется значительно раньше, чем вызывается действие Index, и в момент построения HttpContext действительно недоступен. Что плохого в том, чтобы сослаться на него в методе контроллера Index
?
instead of putting your HttpContext.Request.IsAuthenticated
in Controller level you should put it in Controller Base class that will be inherited in all of your controller with an override method of OnActionExecuting() method.
В базе Controller у вас должно быть
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"]
на вашей странице Master.
По ссылке, которую вы дали, и в связи с тем, что вы сделали, ваш ApplicationController
является Page Controller, а не Base Controller. В примере ApplicationController
является базовым контроллером, который наследуется HomeController
, но вы сделали то, что вы поместили метод Action внутри вашего базового контроллера, который является ApplicationController
, поэтому ваш метод Action Index не будет вызываться при вызове любой страницы (страницы Index), которая не из ApplicationController.