2015-06-10 68 views
1

比方说,我有一个Currency Cookie,它应该是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; 
    } 
} 

回答

0

构造函数可能不是这个逻辑的最佳位置。我个人使用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 

希望这有助于你出去。

3

我不知道,如果它的可能到控制器的构造函数中重定向,但肯定似乎像一个坏主意。

如果您想要在动作之前继续检查每个请求的路由,那么您可能需要查看自定义动作过滤器。网上有大量的引用,但是herecouple

+0

在我看来,大多数时间在构造函数中进行密集逻辑是一个坏主意。 – Matthew