我正在关注这个 Microsoft 的 ASP.NET MVC 教程:

我的代码略有不同,我试图访问 HttpContext.Request.IsAuthenticated 在控制器的构造函数中。

namespace SCE.Controllers.Application
{
    public abstract class ApplicationController : Controller
    {
        public ApplicationController()
        {
            bool usuario = HttpContext.Request.IsAuthenticated;
        }           
    }
}

问题是 HttpContext 始终为空。

有针对这个的解决方法吗?

有帮助吗?

解决方案

在调用索引动作的点之前,该控制器是显着实例化的,并且在构建httpcontext的构建时刻确实不可用。在您的控制器方法中引用它有什么问题 Index?

其他提示

而不是把你的 HttpContext.Request.IsAuthenticated 在控制器级别,您应该将其放在控制器基类中,该基类将通过 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 因此,当您调用任何非来自 ApplicationController 的页面(索引页面)时,您的 Action Index 方法将不会被调用。

我建议您使用:

 System.Web.HttpContext.Current.Request

只记得 System.Web.HttpContext.Current 是线程的,但是如果您不使用其他线程,则解决方案可行。

该问题的解决方案是通过传递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;
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top