在构造函数内部重定向

本文关键字:重定向 内部 构造函数 | 更新日期: 2023-09-27 17:54:55

假设我有一个Currency饼干,它应该是USDGBP。如果有人手动将其更改为RUB,它将恢复为USD

为了实现这一点,我创建了BaseController类来继承System.Web.MVC.Controller,然后我的项目中的每个控制器都将继承BaseController,在BaseController构造函数中我调用CheckcookieValidity()方法。代码如下:

public class BaseController : Controller
{
      public BaseController()
      {
           If (CheckCookieValidity() == false)
           {
                SetDefaultCookie();
           }
      }
}
public void SetDefaultCookies()
{
    var curr = new HttpCookie("curr");
    curr.Value = "USD";
    curr.Expires = DateTime.UtcNow.AddDays(2);
    HttpContext.Current.Response.Cookies.Set(curr);
}

我有一些问题,如果SetDefaultCookie()被调用,cookie不会改变,直到下一页,所以

  1. 是可能的重定向/刷新页面内部构造函数?
  2. 这是一个可接受的方式来检查cookie的有效性?我知道这个问题可以被归类为固执己见,但我需要知道是否有更好的方法来实现这一点。

任何帮助都将是感激的,并为糟糕的英语道歉。

答:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    if (CheckCookiesValidity() == false) {
        SetDefaultCookies();
        RouteValueDictionary route = new RouteValueDictionary(new {
            Controller = "Home",
            Action = "Index"
        });
        filterContext.Result = new RedirectToRouteResult(route);
        return;
    }
}

在构造函数内部重定向

我不知道它是否可能在控制器的构造函数中重定向,但肯定似乎不是个好主意。

如果您想在操作之前继续检查每个请求,那么您可能需要查看自定义操作过滤器。web上有很多关于它们的参考资料,但这里有几个

构造函数可能不是这种逻辑的最佳位置。我个人使用Initialize方法来自定义AuthUser加载:

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);
        // Custom code logic for every controller here
    }

扩展Tim的建议,还可以推荐一个属性。我想到了这样的东西:

public class CurrencyCheckAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        // Put your logic and potential redirect here.
    }
}

这可以全局应用到你所有的控制器中,如:

[CurrencyCheck()]
public class BaseController : Controller