asp.net mvc - net - accediendo a HttpContext.Request en el constructor de un controlador
forms asp net core (4)
El Controlador se crea una instancia significativa antes del punto en que se invoca la acción del Índice, y en el momento de la construcción, HttpContext no está disponible. ¿Qué hay de malo en referenciarlo en el Index
su método de controlador?
Estoy siguiendo este tutorial ASP.NET MVC de Microsoft :
Mi código es ligeramente diferente, donde intento acceder a HttpContext.Request.IsAuthenticated
en el constructor del controlador.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
El problema es que HttpContext
siempre es nulo.
¿Hay una solución para esto?
La solución de este problema es crear un método de anulación de Inicializar pasando el objeto 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;
}
}
}
Te sugiero que uses:
System.Web.HttpContext.Current.Request
Solo recuerde System.Web.HttpContext.Current
es threadstatic, pero si no usa un hilo adicional, la solución funciona.
en lugar de colocar su HttpContext.Request.IsAuthenticated
en el nivel del Controlador, debe colocarlo en la clase Base del Controlador que se heredará en todos sus controladores con un método de anulación del método OnActionExecuting ().
En tu base de controladores deberías tener
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext ctx) {
base.OnActionExecuting(ctx);
ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
}
}
y todo su controlador debería heredar la clase BaseController
public class ApplicationController : BaseController
ahora debería obtener ViewData["IsAuthenticated"]
en su página maestra.
Editar
Con el enlace que ha proporcionado, y en relación con lo que ha hecho, su controlador de ApplicationController
es un controlador de página, no un controlador base. En el ejemplo, ApplicationController
es un controlador base que es heredado por HomeController
pero lo que has hecho es colocar el método de acción dentro de tu controlador base, que es el controlador de ApplicationController
por lo que no se invocará tu método de índice de acción cuando llames a cualquier página ( Página de índice) que no es del ApplicationController.