2009-09-08 5 views
3

誰もASP.NET MVCで言語依存ルートを作成した経験がありますか?私がしたいことは、SEOを改善するためのURLをローカライズしたことです。したがって、例えばhttp://mysite.com/products/carshttp://mysite.com/produkter/bilarと同じコントローラ/アクションにマップされますか?ASP.NET MVCの言語依存ルート

私はちょっとブラウズしようとしましたが、これに似たものは見つかりませんでした。私はそれが本当に良いアイデアだとは確信していませんが、ユーザーが自分の言語で検索しているときにSEOを助けると思うでしょう。私はこれがmvcルートエンジンのいくつかのカスタマイズを取ると思います。

編集:Matoは今までのところ最高のソリューションを提供していますが、私はカスタムRouteHandlerソリューションを参考にしたいと思います。

答えて

3

ような何かを行うことができます。たとえば、翻訳をリソースファイルまたはDBに格納することができます。これを行う最も簡単な方法は、DefaultControllerFactoryを継承し、CreateController関数を上書きすることです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace System.Web.Mvc 
{ 
    class CustomControllerFactory : DefaultControllerFactory 
    { 
     public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
     { 
      /** 
      * here comes your code for translating the controller name 
      **/ 

      return base.CreateController(requestContext, controllerName); 
     } 
    } 
} 

最後のステップは、アプリケーションの起動時に(Global.asaxで)コントローラファクトリの実装を登録することです。それがエラーを起こしやすいとなりますので、

namespace MyApplication 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory)); 
     } 
    } 
} 
+0

これは間違いなく興味深いように思えますが、残念ながらエリアやアクションなどのコントローラ名よりもURLには他の部分もあります。だから私はそれがルートレベルでおそらく最も良い解決だと思う。しかし、これは何とかここでも処理できるのでしょうか? – Runeborg

+0

RequestContextを通じてRequestオブジェクトにアクセスできるので、必要なすべてのパラメータを操作できます。したがって、この時点で領域やアクションを翻訳することに問題はありません。 – Mato

+0

あなたは、routedataのエリア/コントローラ/アクションを変更することを意味しますか?はい、これはルートの後に評価される場合、実際には動作します。 – Runeborg

3

SEOの1つのことは、検索エンジンが2つの異なるリンクで2つの同一の文書を見つけた場合、ページの1つのページランクを低下させることです。その後、ページのコンテンツも翻訳する必要があります。

+1

コンテンツはもちろんローカライズされます:) – Runeborg

1

あなたは正規表現のルート(http://iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx)を使用し、その後、あなたはそれを初期化する前に、コントローラの名前を変換する専用のコントローラファクトリクラスを実装することができ

routes.Add(new RegexRoute(@"^(Products|Produkter)$", new MvcRouteHandler()) 
{ 
    Defaults = new RouteValueDictionary(new { controller = "Products" }) 
}); 
+1

はい、これは興味深いです。しかし、もっと自動化されたやり方をしたいと思っています。 RegexRouteに似たRouteクラスを拡張することにもっと注目するべきでしょう。 – Runeborg

0

私は(ウィッヒは非自明のための本当の痛みをすることができ、使用可能なすべてのURLパターンを手動でカスタマイズの強いレベルを必要とする以外に、正規表現ベースのアプローチをお勧めしません。ウェブサイト)。

@Runeborgと同じように、私は仕事をより自動化する方法を強くお勧めします。 MVC 5(と<)のWebアプリケーションでは、私は常に最新の年に試したものの中で最も多目的なものであることが判明した次のものを使用します。あなたがMVC5またはあなたの上を使用している場合も属性ベースのルーティングのために行くことができます(入ってくるURLを処理するために

  • 多言語意識ルート

    あなたは基本的に3つのものを実装する必要があります代わりに、これを処理するためにグローバルルールを使用することをお勧めします)。

  • これらの種類のマルチ言語要求を処理するLocalizationAttribute
  • アプリケーション内でHtml.ActionLinkおよび/またはUrl.Action拡張メソッド)のこれらのURLを生成するヘルパーメソッドです。

詳細およびコードサンプルについては、this answerを参照してください。

このトピックに関する追加情報とサンプルについては、this postもご覧ください。

関連する問題