asp.net mvc基本路由问题

时间:2012-08-04 20:00:53

标签: asp.net-mvc

我在查看文件夹下有两个文件夹。一个是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 的网址时,会从主页渲染index.aspx文件夹,但当我输入网址,如 http:// localhost:7221 / DashBoard ,然后找不到页面,但如果我键入 http:// localhost:7221 / DashBoard / MyDash 然后页面即将到来。

所以我的第二个路由代码出了什么问题。当我输入类似 http:// localhost:7221 / DashBoard 的网址时,为什么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 } 
);

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

1 个答案:

答案 0 :(得分:1)

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

然而,您的2种路线模式(路线的第2个参数.MapRoute)是相同的:

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

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

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

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

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

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

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

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