Определенное определение маршрута должно быть определено до общего значения по умолчанию. Порядок определения маршрутов действительно имеет значение.
routes.MapRoute(
name: "Test Edit",
url: "Test/Edit/{accessLevel}",
defaults: new { controller = "Test", action = "Edit",
accessLevel = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index",
id = UrlParameter.Optional }
);
Если вы держите другой порядок, как то, что у вас есть (Generic-умолчанию первый, конкретный один позже), когда приходит запрос на Test/Edit/2
Он будет согласован с общим определением маршрута, поскольку Test
является действительным контроллером и Edit
- допустимое имя метода действия, а 2
может быть допустимым значением параметра для параметра Id param. Поскольку запрос получил правильное определение маршрута в соответствии с его шаблоном url, он никогда не будет оцениваться по другим определениям маршрутов, определенным ниже первого.
Сначала определите все определённые определения маршрута и укажите generic-default
как последний.
Или вы можете использовать маршрутизацию атрибутов для определения этого шаблона маршрута в контрольном контроллере. Чтобы включить маршрутизацию атрибутов, вы можете вызвать метод MapMvcAttributeRoutes
в методе маршрута RouteConfig.cs . Вы по-прежнему сохраните определение маршрута по умолчанию.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
и в вашем TestController
[Route("Test/Edit/{id?}")]
public ActionResult Edit(int? id)
{
//check id value and return something
}
Кроме того, нет никакого смысла в определении пользовательского маршрута, если он совпадает с общим определением маршрута по умолчанию. В вашем случае. Даже если вы не определяете настраиваемый маршрут, перейдет к методу Edit
действия TestController
, поскольку запрос соответствует определению маршрута по умолчанию.
Люди обычно используют эти определения пользовательских маршрутов для создания хороших шаблонов URL, как
определения
[Route("Product/{id}/{name}")]
public ActionResult View(int id,string name)
{
//check id value and return something
}
Этого маршрут будет соответствовать запросу Product/34/seo-friendly-name
. Взгляните на URL этого вопроса, и вы поймете, что я здесь объясняю.
Просто используйте AttributeRouting и вырежьте дерьмовую сломанную таблицу маршрутизации. – Phill
Я пробовал на самом деле, но я получаю тот же результат, не могли бы вы предоставить образец? – Spikee
Не могли бы вы поменять свой маршрут в RouteConfig и попробовать его – Dilip