2016-04-25 101 views
0

我對MVC中的區域和Url路由相當陌生,所以我不確定在這裏需要做什麼來獲得我期待的結果。單個控制器的隱藏區域名稱

我有一個地區叫做Policy,在那個地區我有三個控制器:PolicyController,GroupControllerSectionController

與此問題是,當我想例如去策略的URL看起來像的細節:http://www.example.com/Policy/Policy/Detail/1而是我想它看起來像:http://www.example.com/Policy/Detail/1

我見過幾個例子關於如何從URL完全隱藏區域,但這不是我想要做的。因爲我仍然希望看到http://www.example.com/Policy/Group/Indexhttp://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 
     ); 
    } 
}