2016-10-05 9 views
1

はじめに:MapRouteパラメータのデフォルト値としてCookie値を設定するにはどうすればよいですか?

私は多言語Webアプリケーションを開発しています。管理者は新しい言語を作成できます(この情報はデータベースに保存されています)。したがって、言語はコードのどこかにハードコードされません。ユーザーの優先言語はブラウザのクッキーに格納されます。

今、私はこのことから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()); 
     } 
    } 
} 

パラメータ{LANG}が追加されますすべてのリクエストURLに私はクッキーからデフォルト値を設定する必要があります。サービス方法GetLanguageFromBrowserCookie()は、HttpContext.Current.Request.Cookiesオブジェクトを使用して、クライアントから送信されたクッキーにアクセスします。

しかし、HttpContext.Current.Requestオブジェクトは、要求処理パイプラインのこの段階ではアクセスできません。そして私はこのエラーを受け取ります:"このコンテキストではリクエストは利用できません"

クッキー値を持つMapRouteパラメータをフェッチする方法はありますか?

答えて

1

私はこれを行う方法を考え出した。追加のロジックを使用してリクエストURLを処理するには、カスタムRouteHandlerを作成する必要があります。

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); 
    } 
} 

私はを作成し、デフォルトルートに渡します。 GetHttpHandlerメソッドでは、現在のHttpRequestにアクセスし、要求から任意のデータを取得できます。

関連する問題