【问题标题】:How do I get this ASP.NET routing to work properly?如何让这个 ASP.NET 路由正常工作?
【发布时间】:2023-03-15 03:27:01
【问题描述】:

我正在尝试使用 ASP.Net MVC 3 编写一个非常简单的 CMS 系统原型。

系统有一个控制器,有两个动作:显示和创建。

“显示”操作的格式最多包含 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
            }
        );

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

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

[“是”代表问题“您要为此路径创建页面吗?”的答案]

因此,在测试“默认”路由时,我看到以下所有路径都成功调用了“显示”操作: {空的} 一种 a/b a/b/c A B C D a/b/c/d/e

太棒了。

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

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

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

对于路径“/a/b”,链接提供“localhost{: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”,该链接提供“localhost{:port}/create/a/b/c/d/e” - 这是我所希望的

为什么它只在我提供“/a/b/c/d”或“/a/b/c/d/e”时才有效?

我知道我很白痴,请帮帮我

桑迪

【问题讨论】:

  • 不久前我遇到了类似的问题。尝试将 UrlParameter.Optional 更改为 ""

标签: asp.net asp.net-mvc routing url-rewriting asp.net-mvc-3


【解决方案1】:

我认为是多个可选参数导致了差异。
怎么样:

    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 });

【讨论】:

  • 非常感谢,这很好。此外,您的解决方案通过明智地使用可选参数来减少所需路线数量的方式也很有启发性。谢谢你帮助我。
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2016-01-02
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多