我在基本控制器类中初始化了方法,只要执行任何操作方法,就会调用该方法。在每个操作方法上,我想检查我的会话,如果它是null,它应该重定向到登录页面。
public class BaseController : Controller
{
protected IDataRepository _appData = new DataRepository();
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
if (SessionFactory.CurrentAdminUser == null)
{
RedirectToLogin();
}
}
}
public ActionResult RedirectToLogin()
{
return RedirectToAction("AdminLogin", "Admin");
}
它正在调用此方法,但不会重定向到管理员登录方法并继续执行并调用流程中的方法,因此会出现错误。
简而言之,我想检查每当我的应用程序会话变为空时它应该重新登录到登录页面并且检查所有方法都不方便。请给我一些好方法。
答案 0 :(得分:18)
您正在调用RedirectToLogin
,而RedirectToActionResult
只会返回一个没人使用的protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting();
if (SessionFactory.CurrentAdminUser == null)
filterContext.Result = new RedirectResult(Url.Action("AdminLogin", "Admin"));
}
,并且不会影响流程的流程。
请改为尝试:
Initialize
或者,如果您坚持覆盖protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
if (SessionFactory.CurrentAdminUser == null)
{
requestContext.HttpContext.Response.Clear();
requestContext.HttpContext.Response.Redirect(Url.Action("AdminLogin", "Admin"));
requestContext.HttpContext.Response.End();
}
}
:
[Authorize]
另外,请检查{{1}}过滤器,它可能更适合您的需求。请参阅here。
答案 1 :(得分:1)
更简单的方法:
public void RedirectToLogin()
{
RedirectToAction("AdminLogin", "Admin").ExecuteResult(this.ControllerContext);
}