Asp.net mvc asp.net mvc基本路由问题
“查看文件夹”下有两个文件夹。一个是Home,它有index.aspx文件 视图文件夹中的另一个文件夹名为DashBoard,其中包含MyDash.aspx 我的路由代码类似于global.asaxAsp.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
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设置匹配项。有关此操作的原因以及您的建议(在更新中)不起作用的原因,请参阅原始问题下的我的评论。