2017-07-15 86 views
0

我需要語言參數的值,我想這碼ASP.NET MVC:如何獲取路由值

if(HttpContext.Current.Request.RequestContext.RouteData.Values["language"] == null) 
{ 
    HttpContext.Current.Request.RequestContext.RouteData.Values["language"] = "en-US"; 

} 

上面的代碼使得像這是非常好的以下網址

http://localhost:25576/en-US/Home

的問題是,當用戶輸入http://localhost:25576/Home(無EN-US) 的HttpContext.Current.Request.RequestContext.RouteData.Values["language"]值變爲 「家」

我的問題是如何讓語言參數的實際值,如果用戶刪除的en-US或者如果用戶輸入http://localhost:25576/Home

RouteConfig

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

       } 
       ); 
     } 

回答

0

您可以創建用於該目的的新ActionFilterAttribute

public class LocalizationAttribute : ActionFilterAttribute 
{ 
    private readonly string _defaultLanguage = "en-US"; 

    public LocalizationAttribute(string defaultLanguage = null) 
    { 
     this._defaultLanguage = defaultLanguage ?? this._defaultLanguage; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var language = filterContext.RouteData.Values["language"] as string ?? this._defaultLanguage; 

     if (language != this._defaultLanguage) 
     { 
      try 
      { 
       Thread.CurrentThread.CurrentCulture = 
        Thread.CurrentThread.CurrentUICulture = 
         CultureInfo.CreateSpecificCulture(language); 
      } 
      catch 
      { 
       throw new NotSupportedException($"Invalid language code '{language}'."); 
      } 
     } 
    } 
} 

你還需要的是ActionFilter註冊爲GlobalFilter的一部分。

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new LocalizationAttribute("en-US"), 0); 
    } 
} 
+0

謝謝您的幫助和努力:) 我想你的代碼,仍然可以得到的資源不能被發現的消息,當我輸入http ://本地主機:/首頁/聯繫的 HTTP 25576 代替:// localhost:25576/zh-CN /主頁/聯繫人 – Alex

+0

@Alex您是否嘗試過創建'LocalizationAttribute'?另外,您的本地化路由應該在默認路由之後註冊。 – msmolcic

+0

是的,我已經嘗試過,仍然面臨同樣的問題 – Alex

0

的「語言」是「空」或你的代碼「空」,如果用戶的請求,忽略了這個令牌。因此,您必須將其分配爲默認值,例如「en-US」。

拿這個作爲一個例子:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "DefaultLocalized", 
       url: "{language}/{controller}/{action}/{id}", 
       defaults: new 
       { 
        controller = "Home", 
        action = "Index", 
        id = UrlParameter.Optional, 
        language = "en-US" 

       } 
       ); 
     } 

並請刪除您已經向我們展示上面的代碼的語言分配片段,它可以完全通過缺省路由的配置來完成。

+0

謝謝你的幫助和努力:) 我試過你的代碼,仍然得到資源無法找到消息時,我輸入 http:// localhost:25576 /首頁/聯繫 而不是 http:// localhost:25576/en-US/Home /聯繫 – Alex

+0

NightOwl888,你能幫我嗎 – Alex

+1

@Alex - [重複問題](https://stackoverflow.com/a/32839796 )的確提供了答案,但是它被埋在其他的東西之中,其他用戶做錯了,你不是。向下滾動到標題爲** Default Culture **的部分以查看方式。你只需要在URL中沒有* language參數的第二個默認路由(但是URL的其餘部分相同),它將'language'路由值設置爲默認語言。如果您希望在URL中沒有文化的情況下生成默認文化,那麼也需要約束。 – NightOwl888