0

我在视图文件夹下有两个文件夹。一个是 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 正在从主文件夹呈现但是当我输入像http://localhost:7221/DashBoard这样的 url然后未找到页面即将到来,但如果我输入http://localhost:7221/DashBoard/MyDash则页面即将到来。

所以我的第二个路由代码有什么问题。为什么当我输入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 } 
);

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

4

1 回答 1

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不起作用,因为它被第一个路由模式拾取,但是您没有传入操作名称,因此它会查找默认值 - 索引 - 我猜你还没有在仪表板控制器。

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

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

这是一条更具体的路线,所以它需要在 catch-all 之前走{controller}/{action}/{id}。没有开始的东西不会/DashBoard被它捡起来。

于 2012-08-04T20:20:02.423 回答