2015-06-10 45 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