2017-11-18 9 views
0

ホームコントローラに存在する「About Us」や「Contact Us」のような簡単なビューがあります。コントローラがURLを渡さなかったときに、MVCルートルールがホームコントローラにデフォルト設定される

私は、URLの代わりに、私はURLでアクションを指定していないときに、他のコントローラをこのの世話をするが、壊す新しいルートを追加www.xyz.com/Home/ContactUs

www.xyz.com/ContactUsみたいに自宅部分を持っていない希望

// Home Routes 
RouteTable.Routes.MapRoute("HomeRoute", "{action}", new { controller = "Home", action = "Index" }); 

// Default 
RouteTable.Routes.MapRoute("Default", "{controller}/{action}", new { controller = "Home", action = "Index" }); 

これは明らかに、ルートエンジンがwww.xyz.com/ContactUsのようなURLにどのルートを使用するかを判断できず、最初のものをマッチさせるためです。

私はそれぞれコントローラを作ることができますが、これはあまり効率的ではないようです。私はビューごとに1つの空のビューアクションをラップするために30のコントローラで終わることは嫌です。

私はたぶん各コントローラを作成することになりますが、何かのようなルートを作成する方法があるかどうかを知りたがっています"1つのパラメータだけが渡された場合は、 、もしそれが家庭用コントローラーのためであると仮定しないならば。

+0

[なぜasp.net mvcの共通ルートの前に特別なルートをマップするのですか?](https://stackoverflow.com/a/35674633/)を参照してください。 MVCに最初のルートをスキップして2番目のルートに移動するよう指示するには、何かが必要です。最も単純なオプションは '{action}'(文字通り何かにマッチする)を使うのではなく、 'ContactUs'のようなルート設定で静的URLを使うことです。属性ルーティングは別のオプションですが、独自の問題があります(つまり、属性を作成する際には常に注意する必要があります*デフォルトで*未定義の注文*があるため、Orderプロパティを明示的に設定する必要があります) 。 – NightOwl888

答えて

1

MVC属性ルーティングを使用して、これらのSEOに適したルートを作成できます。

[Route("About")] 
public ActionResult About() 
{ 
    return View(); 
} 
[Route("Contact")] 
public ActionResult Contact() 
{ 
    return View(); 
} 

属性ルーティングが有効であると仮定します。

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

    routes.MapMvcAttributeRoutes(); 

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

    ); 
} 

もう1つの方法として、試したことに類似した2つのルート登録があります。これは、yourSite/About/のようなリクエストを渡すために働きます(レンダリングすると、HomeControllerのAboutアクションが実行されます)。しかし、あなたがyourSite/Booksのようなものをリクエストした場合、それはIndexアクションによって処理されません。BooksコントローラのURLは、私たちがSEOに適したルートのために定義した最初のパターンと一致しているため、のアクションメソッドがない場合、 (あなたはこのルート登録を持っていなかった場合は、それが働いているだろう)

routes.MapRoute(
    name: "JustActions", 
    url: "{action}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

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

別のオプションは、あなたが属性ルーティングアプローチを好まない場合、あなたは1で、この特定のルート1のためのあなたのRegisterRoutes方法でルートを登録することができます。 (これは、属性ルーティングによるルートの定義と似ていますが、1つの場所で行います。一般的なデフォルトルートの前に特定のルートが登録されていることを確認してください)。私は個人的にそれ以上の属性ルーティングを好むが、私はそれがより読みやすいと感じている。

+0

私は、1つの一般的なものを作るのではなく、ビューごとに特定のルートを作ることについて考えなかったと思います。性能、テストなどの観点から属性ルーティングを使用することには欠点がありますか? – user3953989

+1

私が知っているパフォーマンスオーバーヘッドはありません。私は個人的には、それがより読みやすいと感じるので、個別の特定のルート定義よりも属性ルーティングアプローチを好む。 – Shyju

+0

もちろん、属性ルーティングを使用するためのパフォーマンスオーバーヘッドがあります。 Reflectionを使用して、属性に入れた値を読み込みます。しかし、このオーバーヘッドは通常アプリケーションの起動に限られます。 – NightOwl888

関連する問題