【问题标题】:asp.net mvc basic routing issueasp.net mvc 基本路由问题
【发布时间】:2012-08-04 20:00:52
【问题描述】:

我在视图文件夹下有两个文件夹。一个是 Home 并且有 index.aspx 文件 视图文件夹中名为 DashBoard 的另一个文件夹,其中包含 MyDash.aspx

我的路由代码类似于 global.asax

        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(
        "DashBoard", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "DashBoard", action = "MyDash", id = UrlParameter.Optional } // Parameter defaults
        );
    }

所以当我输入像 http://localhost:7221/http://localhost:7221/Home 这样的 url 时 index.aspx 正在从 Home 呈现文件夹,但是当我键入 http://localhost:7221/DashBoard 之类的 url 时,找不到页面,但是如果我键入 http://localhost:7221/DashBoard/MyDash strong> 然后页面来了。

所以我的第二个路由代码有什么问题。为什么当我输入 http://localhost:7221/DashBoard 之类的 url 时没有出现 MyDash.aspx。怎么了?

我需要在我的第二个路由代码中更改什么??

请看一下.....我是 MVC 的新手。谢谢

我的更新

当我更改 global.asax 文件中的路由条目时,它开始工作。 你能解释一下为什么....

            routes.MapRoute(
                "DashBoard",
                "DashBoard/{action}/{id}",
                 new { controller = "DashBoard", action = "MyDash", id = UrlParameter.Optional }
            );

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

我可以这样写路由代码吗

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

两个网址的相同模式....请详细讨论。谢谢

【问题讨论】:

  • “DashBord”应该是“DashBoard”?
  • 我修正了拼写,但仍然没有运气。我认为路线名称并不重要,它可以是任何东西。
  • DashBoard/{action}/{id} 匹配任何以“DashBoard”开头的 URL。如果没有传入第二个参数,则该操作默认为“MyDash”,因此http://localhost/Dahsboard 有效。如果路由不以“DashBoard”开头,则该模式不匹配,然后检查下一个路由映射是否匹配。下一个路由映射非常通用,任何具有 0 到 3 个路由参数(例如 /foo 或 /foo/bar 或 /foo/foo/bar)的东西都会被它捕获。
  • 您在更新中重写路线将起作用。第 4 个参数将否定第 3 个参数。此方法重载中的第 4 个参数设置了可以接受哪些值的约束,因此此映射将匹配带有“DashBoard”的路由,而其中带有“Home”的路由根本不会匹配到全部。所以第三个参数中指定的默认控制器在所有情况下都会被完全忽略。
  • ...重新措辞,如果 URL 没有传入控制器,您的第三个参数(在您的重写中)会说使用“Home”,但您的第四个参数是这样说的URL 必须 传入一个控制器名称“DashBoard”作为 URL 的第一部分,否则这里根本没有匹配 - 它会继续检查下一个路由映射,由下一个 routes.MapRoute 进行匹配。

标签: asp.net-mvc


【解决方案1】:

路由名称(第一个参数)对调用的动作/控制器没有影响。

但是,您的 2 个路线模式(routes.MapRoute 的第二个参数)是相同的:

"{controller}/{action}/{id}"

...所以任何 被第二个模式匹配的东西都会被第一个模式捕获。因此,它们都被第一个地图定义所映射。

http://localhost:7221/Home 有效,因为它匹配第一个模式,并且可能 Index 操作存在于您的 Home 控制器中。

http://localhost:7221/DashBoard/MyDash 之所以有效,是因为即使它与第一条路由匹配,它也会通过通过 URL (DashBoard/MyDash) 传入的路由参数覆盖默认操作/控制器 (Home/Index)。

http://localhost:7221/DashBoard 不起作用,因为它被第一个路由模式拾取,但是您没有传入操作名称,因此它会查找默认值 -- 索引 -- 我猜你没有'不在 DashBoard 控制器中设置。

更新(如何解决问题):
因此,如果您希望 http://localhost:7221/DashBoard 使用名为 MyDash 的操作映射到名为 DashBoard 的控制器,同时仍允许 {controller}/{action}/{id} 拾取其他模式,请删除您的第二条路线,并将其放置为 1st 路线:

routes.MapRoute(
        "DashBoard", 
        "DashBoard/{action}/{id}",
         new { controller = "DashBoard", action = "MyDash", id = UrlParameter.Optional }               
    );

这是一条更具体的路线,所以它需要在全能{controller}/{action}/{id}之前走。 /DashBoard开头的任何内容都不会被它接收。

【讨论】:

  • 在你原来的问题下查看我的 cmets,详细了解为什么这样做,以及为什么你的建议(在你的更新中)不起作用。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2011-11-30
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多