2012-02-15 19 views
1

ルートをコントローラにプログラムでマップすることは可能ですか?言い換えれば、私は、コントローラなしでルートを作成し、URLマップの残りのパラメータの値に基づいて、正しいコントローラを要求にマップしたいのですか?コントローラへのルートのプログラムによるプログラミング

例:

URL:私は「私たちは約-」要求のためのコントローラを使用して、設定されているコントローラ、当社のシステムのアップを見てみたい

example.com/about-us 。上記のような多くの異なるページが存在するため、異なるコントローラーを使用するので、デフォルトコントローラーにすることはできません。

答えて

2

なぜこれが必要ですか?このような状況を処理するための通常のMVCの方法は、異なるコントローラの異なるルートを追加し、ルート自体の中のパラメータの値を指定するか、RouteConstraintを使用することです。

本当にがルーティングロジックを実行しているとしたら、別の方法では、すべてのクエリを処理する1つのアクションで「ルーティングコントローラ」を作成している可能性があります。このアクションコードは、パラメータ値を確認し、必要なコントローラ上の任意のアクションにリクエストをリダイレクトするためにreturn RedirectToAction(...)を実行することができます。

UPDATE:例コード

Global.asax.csに次のデフォルトルートの作成:

// usings here... 

namespace YourApp.Controllers 
{ 
    public class RouteController : Controller 
    { 
     public ActionResult Index(string pathInfo) 
     { 
      ... 
      // programmatically parse pathInfo and determine 
      // controllerName, actionName and routeValues 
      // you want to use to reroute current request 
      ... 

      return RedirectToAction(actionName, controllerName, routeValues); 
     } 
    } 
} 
:また、次の内容でコントローラクラスRouteController.csを追加

routes.MapRoute(
    "Default", // Route name 
    "{*pathInfo}", // URL with parameters 
    new { controller = "Route", action = "Index"} // Parameter defaults 
); 

+0

私はそれを行うための通常の方法に精通しているんだけど、我々は唯一のドメインの後のurlに優しいページ名をしたい顧客を持っています。 –

+0

2番目の方法の例で私の答えを更新しました –

0

カスタムIRouteHandlerの実装を使用することをお勧めします。制約を使ってルートマッチングを制限し、IRouteHandler実装内でインスタンス化されるコントローラを書き直すことができます。 など。

public class RewriteController : IRouteHandler 
{ 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
        // here some logic to determine controller name you would like 
        // to instantiate 
        var controllerName = ...; 

        requestContext.RouteData.Values["controller"] = controllerName; 
     return new HttpControllerHandler(requestContext.RouteData); 
    } 
} 

次に、あなたのルートは、次のようなことがあります

 routes.MapHttpRoute 
     (
      name: Guid.NewGuid().ToString(), 
      routeTemplate: "{controller}/{action}", 
         defaults: new { action = "Index" }, 
      constraints: new 
      { 
       controller = "about-us" 
      } 
     ).RouteHandler = new RewriteController(); 
関連する問題