2011-02-12 37 views
5

我正在尝试使用ASP.Net MVC 3编写一个非常简单的CMS系统原型。如何让这个ASP.NET路由正常工作?

系统具有一个控制器,其中包含两个操作:show和create。

“显示”操作的格式最多需要5个可选部分,例如, domain.com/part1/part2/part3/part4/part5

“显示”操作的格式类似,但应具有领先的“创建”部分。 domain.com/create/part1/part2/part3/part4/part5

我有我的Global.asax以下设置:

routes.MapRoute(
     "CreatePageRoute", 
     "create/{part1}/{part2}/{part3}/{part4}/{part5}", 
     new 
      { 
       controller = "Page", 
       action = "Create", 
       part1 = UrlParameter.Optional, 
       part2 = UrlParameter.Optional, 
       part3 = UrlParameter.Optional, 
       part4 = UrlParameter.Optional, 
       part5 = UrlParameter.Optional 
      }); 

    routes.MapRoute(
     "Default", 
     "{part1}/{part2}/{part3}/{part4}/{part5}", 
     new 
      { 
       controller = "Page", 
       action = "Show", 
       part1 = UrlParameter.Optional, 
       part2 = UrlParameter.Optional, 
       part3 = UrlParameter.Optional, 
       part4 = UrlParameter.Optional, 
       part5 = UrlParameter.Optional 
      } 
     ); 

如果我的“显示”方法无法找到页面匹配提供的路径,它会返回一个'not found'页面,其中包含一个选项,用于使用提供的路径创建一个新页面。此链接使用以下定义:

@Html.ActionLink("Yes", "Create") 

[“是”代表问题的答案“吗?你想为这条道路创建一个网页”]

因此测试“默认时“路线,我看到我的 '显示' 操作成功地呼吁所有以下路径: {空} 一个 A/b A/b/C A/b/C/d A/b/c/d/e

这很棒。

但是,由语句“@ Html.ActionLink(”是“,”Create“)生成的”创建“链接会产生不一致的结果。它似乎根据输入的长度生成不同的超链接。结果如下:

对于路径“{空}”,链接提供“本地主机{:端口} /” - 我所期待的“本地主机{:端口} /创建”

对于路径“/a“,链接提供”localhost {:port} /“ - 我希望”localhost {:port}/create/a“

对于路径”/ a/b“ :port}/a“ - 我希望”localhost {:port}/create/a/b“

对于路径”/ a/b/c“,链接提供”localhost {:port}/a/b“ - 我希望”localhost {:port}/create/a/b/c“

对于路径“/ a/b/c/d”,链接提供“localhost {:port}/create/a/b/c/d” - 这正是我所希望的

对于路径“/a/b/c/d/e“,链接提供”本地主机{:端口} /创建/ a/b/c/d/e“ - 这正是我所希望的

为什么只有它当我提供“/ a/b/c/d”或“/ a/b/c/d/e”时工作吗?

我知道我是愚蠢的,请帮我

桑迪

+0

后来我有一个类似的问题。尝试更改`UrlParameter.Optional`只是`“”` – Omar 2011-02-12 07:29:28

回答

1

我相信,多个可选参数是造成discrepency。
如何:

routes.MapRoute("Create5", "create/{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Create", part5 = UrlParameter.Optional }); 
    routes.MapRoute("Create3", "create/{part1}/{part2}/{part3}", new { controller = "Page", action = "Create", part3 = UrlParameter.Optional }); 
    routes.MapRoute("Create1", "create/{part1}", new { controller = "Page", action = "Create", part1 = UrlParameter.Optional }); 

    routes.MapRoute("Default5", "{part1}/{part2}/{part3}/{part4}/{part5}", new { controller = "Page", action = "Show", part5 = UrlParameter.Optional }); 
    routes.MapRoute("Default3", "{part1}/{part2}/{part3}", new { controller = "Page", action = "Show", part3 = UrlParameter.Optional }); 
    routes.MapRoute("Default1", "{part1}", new { controller = "Page", action = "Show", part1 = UrlParameter.Optional }); 
+0

非常感谢,这很好地诀窍。此外,您的解决方案通过审慎使用可选参数减少了所需路线的数量,这种照明方式非常具有启发性。感谢您的帮助。 – sandy 2011-02-13 00:34:03