带有多个控制器名称的MVC3路由问题

时间:2011-11-03 00:11:52

标签: c# .net asp.net-mvc-3 url-routing

这是我的导航层次结构。

  • 目录
      -Collection
    - 媒体
    - 属性
    - 用户
  • 收藏品   -Media
    - 产品
    - 属性

我拥有所有人的控制权。这就是我的网址应该是什么样的

http://Localhost/Catalog/Collection/1  // return all collection for catalogeid 1
http://Localhost/Catalog/Media/1  // return all media for catalogeid 1
http://Localhost/Collection/Media/1  // return all media for collectionid 1

现在使用默认路线

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

它在我的“Catalog”控制器中寻找动作“Collection”,因为我已经在“Collection”Controller中定义了“List”方法,我不想在我的“Collection”中重新定义它 然后我尝试了这个

routes.MapRoute(
            "Catalog_Collection_List", // Route name
            "Catalog/Collection/{id}", // URL with parameters
            new { controller = "Collection", action = "List", id = UrlParameter.Optional } // Parameter defaults
        );

但结果是一样的。 另一个问题是如上所述如何生成链接。 我不能用

@Html.ActionLink("Collection","Collection", "List", new { id = 1 })

因为这会产生类似

的链接
Localhost/Collection/List/1   //I don’t want

我的最终目标是与“收藏”相关的所有动作都应该在“收藏”控制器下。 我不知道我错过了什么。 希望我的问题很明确。 谢谢你的帮助。
修改
使我的问题更清楚。看看这个示例网址

localhost/Catalog/Media/1    // which gives media for catalog
localhost/Collection/Media/1 // which gives media for collection.

现在按照传统方式我必须在每个控制器中定义“媒体”动作。我不想要的。我想要的是基于URL我想从“媒体”控制器调用“列表”操作。 我希望这很清楚。

1 个答案:

答案 0 :(得分:1)

我在这里遇到问题时有点困难。您不希望上面/ collection / list上的url,但这是您在操作链接中指定的内容。查看您的网址,您就会遇到一致性问题。

“它在我的”目录“表中查找动作”Collection“,因为我已经在”Collection“表中定义了方法”List“方法,我不想在我的”Collection“中重新定义相同然后我试过了这个“通过表我认为你的意思是控制器在这里吗?

所以你应该坚持使用一般Url = / Controller / Action / id的格式 收集/列表/ 1。

你绝对可以将它映射到其他地方(顺序肯定很重要 - 路由表中的第一个匹配胜利) - 但是问问自己到目前为止是否要偏离标准。

修改 我相信你想要这条路线,在你的其他路线之前添加它。

routes.MapRoute(
            "Catalog_Collection_List", // Route name
            "Catalog/Media/{id}", // URL with parameters
            new { controller = "Collection", action = "List", id = UrlParameter.Optional } // Parameter defaults
        );