为什么在启动ASP.NET MVC2应用程序时调用了错误的控制器?

时间:2010-10-06 20:55:39

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing

我有一个名为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中尝试了这一切。

3 个答案:

答案 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模式匹配?