2016-04-25 11 views
0

私は、MVCのエリアとURLルーティングにはかなり新しいので、私が探している結果を得るためにここで何をする必要があるのか​​分かりません。 PolicyControllerGroupControllerSectionController単一コントローラのエリア名を隠す

は、私は3つのコントローラを持って、その領域内Policyと呼ばれる領域を、持っています。

私は例えば、URLがどのように見える政策の細部に行きたい時にこれで問題がある:http://www.example.com/Policy/Policy/Detail/1ではなく、私はそれがどのように見えるしたいと思います:http://www.example.com/Policy/Detail/1

私はいくつかの例を見てきましたエリアからURLを完全に隠す方法については、私がしたいことではありません。私がまだ見たいと思うようにhttp://www.example.com/Policy/Group/Indexまたはhttp://www.example.com/Policy/Section/Index

つまり、エリアと同じ名前のコントローラを使用しているときにエリア名を非表示にしたいだけです。

これは可能ですか?

+0

RouteConfig.csの外観はどうなっていますか? – Mike

答えて

0

デフォルトコントローラーをエリア内のエントリーポイントとして定義できますが、ルーティングでコントローラー名をスキップすることはできません。そうしないとあなたがポリシー・コントローラーで各アクションのデフォルトルートを作成する必要があります:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    // Entry point for each action on Policy controller 
    context.MapRoute(
     "Policy_default_detail", 
     "Policy/Detail/{id}", 
     new { controller = "Policy", action = "Detail", id = UrlParameter.Optional } 
    ); 

    context.MapRoute(
     "Policy_default_anotheraction", 
     "Policy/AnotherAction/{id}", 
     new { controller = "Policy", action = "AnotherAction", id = UrlParameter.Optional } 
    ); 


    // Default entry point 
    context.MapRoute(
     "Policy_default", 
     "Policy/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
    ); 
} 

この設計の欠点は、あなたがポリシーコントローラのアクションの同じ名前のコントローラを持っていない可能性があることです。

エリアの名前がコントローラーの名前と一致しないように、エリアの名前を再考することをお勧めします。

+0

これは私がこのプロジェクトでやろうとしていることに対して完璧に機能します。将来のプロジェクトでは、地域の異なる名前を考えて、私はこの矛盾がないと確信しています。ありがとう! – Quiver

0

エリア登録クラスでは、一般的なエリア登録コードの前に特定のルート定義を追加できます。

public class PolicyAreaRegistration : AreaRegistration 
{ 
    public override void RegisterArea(AreaRegistrationContext context) 
    { 

     context.MapRoute(
      "Policy_Tricky", 
      "Policy/{action}/{id}", 
      new { action = "Index", controller = "Policy", id = UrlParameter.Optional }, 
      new string[] { "YourProjectName.Areas.Policy.Controllers" } 
     ); 


     context.MapRoute(
      "Policy_default", 
      "Policy/{controller}/{action}/{id}", 
      new { action = "Index", controller = "Home", id = UrlParameter.Optional }, 
      new string[] { "YourProjectName.Areas.Policy.Controllers" } 
      //Providing namespace while defining route to prevent conflict 
     ); 
    } 
} 
関連する問題