2016-10-05 104 views
1

簡介:如何將Cookie值設置爲MapRoute參數的默認值?

我開發了多語言的web應用程序。管理員可以創建新的語言(這些信息存儲在數據庫中)。所以語言在代碼中沒有硬編碼。用戶的首選語言存儲在瀏覽器cookie中。

現在我想從這個配置URL路徑:

www.host.com/home/about 

這樣:

www.host.com/{lang}/home/about 

RouteConfig.cs樣子:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.LowercaseUrls = true; 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     foreach (Route r in routes) 
     { 
      r.Url = "{lang}/" + r.Url; 
      if (r.Defaults == null) 
       r.Defaults = new RouteValueDictionary(); 
      r.Defaults.Add("lang", ServiceLocalization.GetLanguageFromBrowserCookie()); 
     } 
    } 
} 

參數{}郎加到每個請求的網址。我需要從cookie中設置默認值。服務方法GetLanguageFromBrowserCookie()使用HttpContext.Current.Request.Cookies對象訪問客戶端發送的Cookie。

但是HttpContext.Current.Request對象在請求處理管道的這個階段不可訪問。我得到這個錯誤:「請求在此上下文中不可用」

有沒有辦法使用cookie值獲取MapRoute參數?

回答

1

好的。我想出瞭如何做到這一點。我們需要創建自定義RouteHandler來處理具有額外邏輯的請求url。

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.LowercaseUrls = true; 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ).RouteHandler = new CustomRouteHandler(); 
    } 
} 
public class CustomRouteHandler : MvcRouteHandler 
{ 
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var route = (Route)requestContext.RouteData.Route; 

     if (!route.Url.Contains("{lang}")) 
      route.Url = "{lang}/" + route.Url; 
     if (route.Defaults == null) 
     { 
      route.Defaults = new RouteValueDictionary(); 
      route.Defaults.Add("lang", ServiceLocalization.GetLanguageFromBrowserCookie().CodeName); 
     } 
     else 
     { 
      route.Defaults["lang"] = ServiceLocalization.GetLanguageFromBrowserCookie().CodeName; 
     } 

     return base.GetHttpHandler(requestContext); 
    } 
} 

我創建CustomRouteHandler並將它傳遞給默認路由。在GetHttpHandler方法中,我們可以訪問當前的HttpRequest並從請求中獲取任何數據。

相關問題