2012-06-18 46 views
2

我有一个失控的请求控制器,我想在保持一个干净的URL的同时在多个控制器上划分动作。我试图尝试路由,但没有成功。我已经阅读了关于路由的一些示例和教程,但是虽然我理解了这些示例,但似乎没有什么适用于我的案例,并且我觉得并不聪明。我想要的是在我的ApprovalController而不是我的RequestController上处理URL Requests/Approval,所以我编写了以下内容。MVC路由与部分类

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

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

     routes.MapRoute(
      "Approval", 
      "Request/{controller}/{action}", 
      new { controller = "Approval", action="Index", id = "" } 
     ); 

    } 

但它不工作。为什么?我的视图中有一个名为Approval的文件夹,并且在那里有一个名为Index.cshtml的文件。我应该如何编码MapRoute?

编辑

我说我有

+2

您能否显示您映射其他路线的顺序?这可能是另一条路线匹配相同的请求。 – awbergs

+0

我只有标准的“开箱”路线,否则。我更新了问题,以便您可以看到“RegisterRoutes”功能。 –

+0

有关路由的一件事要记住,路由是按顺序进行评估的,只要路由匹配,就是使用的路由,因此首先会导致它不再进一步查看。您可以通过名称来指定路线,在这种情况下是“批准” – Brian

回答

5

所有的路由需要交换两个图路线语句,就像这样:

routes.MapRoute(
    "Approval", 
    "Request/Approval/{action}", 
    new { controller = "Approval", action="Index", id = "" } 
); 

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

原因是目前没有工作是因为第一个语句('Default'路由名称)在第二个语句被评估之前得到匹配。您需要删除批准路径中的“{controller}”并替换为“批准”...除非您特别需要URL /请求/ {任意控制器}/{动作}通过,我怀疑。从您的问题看来,您似乎只需要/请求/批准/即可转至您的审批控制器。

不要忘记将Default路径保留在底部,以便与您的其他控制器和操作相匹配。如果没有其他比赛存在,它可以作为一个通用的。

+0

这样做的窍门。我认为这是因为我在这两个URL中都有相同数量的参数,但是在我被告知该文件不存在之前,它如何不继续寻找替代路线? –

+0

与此有关。现在,如果您尝试在RequestController上调用一个操作,MVC将查找与该操作同名的控制器。 –

+0

@KyleTrauberman你是对的,我刚刚发布了关于此的编辑警告 – Joshua

1

您映射路线的顺序非常重要。在默认路线之前移动第二条路线。

尽管如此,您仍然会遇到问题,因为任何东西/request/something都会寻找SomethingContoller。要解决此问题,请将您的路线更改为:

routes.MapRoute(
     "Approval", 
     "Request/Approval/{action}", 
     new { controller = "Approval", action="Index", id = "" } 
    ); 
+0

感谢您的输入。这实际上是我的第一个方法,但它不起作用。我尝试了@joshuam的建议,并且这个技巧。 –