2012-02-24 16 views
0

3言語で翻訳されたwebformsアプリケーション(VB.net、.NET 4.0)があり、URL以外のすべてをローカライズすることができました。私の好みはルーティングを使用することです(URLの書き換えやIISの書き換えなどではありません)この方向で解決策を見つけたいと思います。ASP.NET WebFormsアプリケーションでのルーティングでURLをローカライズする方法 - MVCでない

多くの読んだ記事のうち、私もこれに遭遇しました:http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes-%28ASPNET-MVC-and-Webforms%29.aspxこの例はMVCアプリケーションのためのものです。 (ここでも多くの質問があります)

コメントとアイデアは大歓迎です!

+0

なぜURLをローカライズするのですか?これはSEOのことですか? –

+0

はい、SEOが主な理由です。また、リンクを送信する(またはブックマークを保存する)と、翻訳されたコンテンツに直接導かれます(URLパラメータを追加することなく、すべてをきれいにします)。 – Spartak

+0

この質問が表示されたときに、URL全体が狂気を書き直すことがあまりにも遠すぎたことはご存知のことです。 – Stilgar

答えて

0

次のように、WebフォームASP.NETアプリケーションでMaartenのソリューションを実装できます。

  1. サンプルをダウンロードしてVisual Studioで開きました。それを見ると、翻訳されたルーティングの重要な部分はRoutingフォルダにあります。

  2. Webアプリケーションで新しいクラスライブラリプロジェクトを作成し、5つのファイルをコピーしました。このプロジェクトではアセンブリ参照がいくつか見つかりませんでしたので、System.WebSystem.Web.Routingを追加しました。

  3. この後、TranslatedRouteCollectionExtensionsクラスには1つの問題しかありませんでした。 2つの拡張方法はMvcRouteHandlerを使用しました。これは、MVCに依存するコードの唯一の部分です。この依存性は、このように両方の拡張メソッドを変更排除するために:

    public static TranslatedRoute MapTranslatedRoute(
         this RouteCollection routes, 
         string name, 
         string url, 
         object defaults, 
         object routeValueTranslationProviders, 
         IRouteHandler routeHandler, 
         bool setDetectedCulture) 
    { 
        TranslatedRoute route = new TranslatedRoute(
                url, 
                new RouteValueDictionary(defaults), 
                new RouteValueDictionary(routeValueTranslationProviders), 
                setDetectedCulture, 
                routeHandler); 
        routes.Add(name, route); 
        return route; 
    } 
    
  4. 私はこのクラスライブラリプロジェクトに私のWebアプリケーションでの参照を追加しました。次のように翻訳されたルートの変更を登録するこの修正マールテンの例では

  5. :カスタムルートハンドラを実装する

    routes.MapTranslatedRoute(
         "TranslatedRoute", 
         "{controller}/{action}/{id}", 
         new { controller = "Home", action = "Index", id = "" }, 
         new { controller = translationProvider, action = translationProvider }, 
         new GeneralRouteHandler(), 
         true 
        ); 
    
  6. は複雑なプロセスではありません。約goodarticlesが見つかります。

関連する問題