2016-04-25 98 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 
     ); 
    } 
}