Почему при запуске приложения ASP.NET MVC2 вызывается неправильный контроллер? - PullRequest
3 голосов
/ 07 октября 2010

У меня есть контроллер с именем 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.

Почему это происходит? Когда я запускаю приложение, которое соответствует шаблону URL, указанному в маршруте Metrics, в URL ничего нет.

Все это делается в Visual Studio 2010 с использованием встроенного веб-сервера.

Ответы [ 3 ]

1 голос
/ 07 октября 2010

Удалите значения по умолчанию из вашего маршрута Metrics:


routes.MapRoute(
  "Metrics",
  "{controller}/{action}/{id}/{period}",
  new { controller = @"Metrics", action = "GetMetrics"}
);

Со значениями по умолчанию MVC может отображать действие GetMetrics в контроллере Metric практически на любой URL-адрес, который вы ему передаете.

1 голос
/ 07 октября 2010

Короче говоря: он использует маршрут Matrics, потому что он соответствует маршруту Matrics.

Короче: маршрут по умолчанию определяет значения по умолчанию для всех компонентов маршрута, и все компоненты маршрута являются необязательными.Все, что делает ваш Metrics маршрут - это добавляет еще один необязательный параметр маршрута со значением по умолчанию ... он в основном не отличается от маршрута по умолчанию, поскольку весь маршрут содержит дополнительные параметры.

Если вы хотите, чтобы он работал,вам нужно отличить ваш маршрут Metrics от маршрута по умолчанию.

Например,

routes.MapRoute(
  "Metrics",
  "metrics/{action}/{id}/{period}",
  new { controller = @"Metrics", action = "GetMetrics", id = 0, period = "" }
);

HTH,
Charles

Примечание:

Нет ничего в URL, когда я запускаю приложение, которое соответствует шаблону URL, указанному в маршруте Metrics.

Давайте посмотрим на это под другим углом - что в URL соответствует URLшаблон, указанный в маршруте по умолчанию?

1 голос
/ 07 октября 2010

Потому что, конечно, соответствует первому корню.

Дело в том, что когда вы предоставляете значения по умолчанию, они становятся необязательными. Если каждое из значений 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 }
);
...