在构造函数内部重定向
本文关键字:重定向 内部 构造函数 | 更新日期: 2023-09-27 17:54:55
假设我有一个Currency
饼干,它应该是USD
或GBP
。如果有人手动将其更改为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不会改变,直到下一页,所以
- 是可能的重定向/刷新页面内部构造函数?
- 这是一个可接受的方式来检查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