2013-04-07 135 views
0

我有一个公司区域的MVC4应用程序。MVC4区域路线:默认控制器上的操作方法

给定的文件结构:

Areas 
\ 
    Companies 
    \ 
    Controllers 
     | 
     DefaultController (Contains Index and Edit actions) 
     TestController (Contains Index and Test action) 

我希望我的网址是这样的:

  • /公司
  • /公司/编辑
  • /公司/测试
  • /公司/测试/测试

我的路线设置就像在我的CompaniesAreaRegistration类中一样。

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

结果:

  • /公司 - 工程
  • /公司/编辑 - 404
  • /公司/默认/编辑 - 工程
  • /公司/测试 - 作品
  • /公司/测试/测试 - 工程

如何在URL中访问我的DefaultController.Edit()动作而没有“默认”?

更新

基于Brad的回答,我知道我可以硬编码这样的路径,它会工作。我真的希望有更多的自动解决方案。我不知道我将在某个区域的默认控制器上执行多少操作。我不想为每个人创建一条新路线。

这是作为App_Start/RouteConfig.cs文件中MVC模板的一部分添加的默认路由。

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

如果我对HomeController有一个名为“Test”的操作,那么我可以使用URL/Test命令执行该操作。我不需要添加一个像“/ Test/{id}”这样的URL的新路由,以便它能够正常工作。它似乎忽略URL的{controller}部分并使用默认的控制器配置。

为什么在一个区域中这样做会改变?

区域路由与默认路由完全相同,除了URL的“公司/”前缀。

作为测试,我将默认路由URL更改为url: "Example/{controller}/{action}/{id}",并且我仍然能够通过URL/Example/Test访问HomeController.Test()。

回答

2

使用:

context.MapRoute(
    name: "Companies_Edit", 
    url: "Companies/Edit/{id}", 
    defaults: new { controller = "Default", action = "Edit", id = UrlParameter.Optional } 
); 

记住参数填充左到右(不能跳过{controller}只有填充{action}。如果你想要假设{controller},请在defaults中指定它)

+0

我只是想补充说,这应该添加到路由表中,而不是替换现有的路由表。此外,添加时,它应该高于您当前使用的默认路由,因为它是更具体的路由。 – Tommy 2013-04-07 02:45:51

+0

感谢您的回答,但我会考虑这种解决方法。在非区域默认控制器中不需要新路线来使其工作。默认路由(由MVC模板添加的路由)可以很好地访问DefaultController上的操作,而无需在URL中指定控制器名称。我更新了我的问题,提供了更多关于令我感到困惑的细节。 – AndrewR 2013-04-07 04:07:33

相关问题