我有一个名为MetricsController
的控制器,只有一个操作方法:
public class MetricsController
{
public ActionResult GetMetrics(int id, string period)
{
return View("Metrics");
}
}
我想将呼叫路由到此控制器,如下所示:
http://mysite/metrics/getmetrics/123/24h
我在我的Global.asax.cs
中映射了另一条路线,如下所示:
routes.MapRoute(
"Metrics",
"{controller}/{action}/{id}/{period}",
new { controller = "Metrics", action = "GetMetrics", id = 0, period = "" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
我刚将此添加到Visual Studio 2010创建的默认模板项目中。
当我运行应用程序时,而不是默认为HomeController
,而是从MetricsController
开始。
为什么会这样?当我启动与Metrics
路由中指定的url模式匹配的应用程序时,url中没有任何内容。
使用内置Web服务器在Visual Studio 2010中尝试了这一切。
答案 0 :(得分:1)
因为它匹配第一个根,当然。
事情是 - 当你提供默认值时 - 它们变成可选的。如果每个routedata值都是可选的,路由是第一个 - 它保证它会先命中。
这样的事情应该有效:
routes.MapRoute(
"Metrics",
"Metrics/GetMetrics/{id}/{period}",
//assuming id, period aren't supposed to be optional
new { controller = "Metrics", action = "GetMetrics" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
答案 1 :(得分:1)
从指标路线中删除默认值:
routes.MapRoute(
"Metrics",
"{controller}/{action}/{id}/{period}",
new { controller = @"Metrics", action = "GetMetrics"}
);
使用默认值,MVC能够映射到度量控制器中的GetMetrics操作,几乎是您传递给它的任何URL。
答案 2 :(得分:1)
简而言之:它使用Matrics
路由,因为它与Matrics
路由匹配。
long:默认路由定义所有路由组件的默认值,所有路由组件都是可选的。您的Metrics
路由所做的就是添加另一个带有默认路由的可选路由参数...它与默认路由基本没有区别,因为整个路由包含可选参数。
如果您希望它起作用,您需要区分Metrics
路线与默认路线。
E.g。
routes.MapRoute(
"Metrics",
"metrics/{action}/{id}/{period}",
new { controller = @"Metrics", action = "GetMetrics", id = 0, period = "" }
);
HTHS,
查尔斯
旁注:
什么都没有 在我开始时的网址中 与url匹配的应用程序 度量标准中指定的模式 路由。
让我们从不同的角度来看一下 - url中的内容与默认路由中指定的url模式匹配?