Asp.net mvc asp.net mvc基本路由问题

Asp.net mvc asp.net mvc基本路由问题,asp.net-mvc,Asp.net Mvc,“查看文件夹”下有两个文件夹。一个是Home,它有index.aspx文件 视图文件夹中的另一个文件夹名为DashBoard,其中包含MyDash.aspx 我的路由代码类似于global.asax public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapR

“查看文件夹”下有两个文件夹。一个是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
        );
    }
所以当我键入url时,比如http://localhost:7221/http://localhost:7221/Home然后index.aspx将从主文件夹呈现,但当我键入url时,如http://localhost:7221/DashBoard然后将出现未找到页面,但如果我像http://localhost:7221/DashBoard/MyDash那么佩奇来了

那么,我的第二个路由代码出了什么问题呢。为什么我键入url时MyDash.aspx不出现,如http://localhost:7221/DashBoard。怎么了

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

请看一看……我是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 } 
);
两个url的模式相同…请详细讨论。谢谢

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

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

"{controller}/{action}/{id}"
。。。所以任何与第二个模式匹配的东西都会被第一个模式捕获。因此,它们都被第一个映射定义映射

http://localhost:7221/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}
之前执行。任何不以
/DashBord
开头的内容都不会被它拾取。

“DashBord”应该是“DashBoard”?我修正了拼写,但仍然没有运气。我认为路由名称可以是任何内容都不重要。
DashBoard/{action}/{id}
匹配任何以“DashBoard”开头的URL。如果没有传入第二个参数,则操作的默认值为“MyDash”,因此
http://localhost/Dahsboard
有效。如果路线不是以“DashBoard”开头,则此模式不匹配,然后检查下一个路线映射是否匹配。下一个路由映射非常通用,任何具有0到3个路由参数(例如/foo或/foo/bar或/foo/foo/bar)的路由都将被它捕获。不,在更新中重新写入路由将不起作用。第四个参数将否定第三个参数。该方法重载中的第四个参数设置了可接受值的约束,因此该映射将只匹配带有“DashBoard”的路由,而其中带有“Home”的路由根本不会匹配。因此,在所有情况下,第3个参数中指定的默认控制器都将被完全忽略……换言之,如果URL未传入任何控制器,则第3个参数(在您的重写中)将表示使用“主”,但第4个参数表示此URL必须传入控制器名称“DashBoard”,作为URL的第一部分,否则这里根本没有匹配项--它将继续并检查下一个路由映射,由next routes.mapproute设置匹配项。有关此操作的原因以及您的建议(在更新中)不起作用的原因,请参阅原始问题下的我的评论。