2

Стандартный шаблон MVC 5.
Так что я пытаюсь понять и создать именованный маршрут будет использоваться как:Почему мой именованный маршрут не работает?

<a href="@Url.RouteUrl(routeName: "myroute", routeValues: new { code = "123" })">this link</a> 

В главном контроллере:

[Route("Home/DoIt", Name = "myroute"), HttpGet] 
public ActionResult DoIt(string code) 
{ 
    return View(); 
} 

MvcAttributeRouting, конечно, включен в RoutConfig.cs:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 
    routes.MapMvcAttributeRoutes(); 
} 

Потому что, если он не был включен, один получит:

Маршрут с именем 'myroute' не найден в коллекции маршрутов. Имя параметра: имя

Но я получаю:

Ресурс не может быть найден. Описание: HTTP 404. Ресурс, который вы искали (или одна из его зависимостей), мог быть удален, изменил свое имя или временно недоступен. Прочитайте следующий URL-адрес и убедитесь, что оно написано правильно.

Запрошенный URL:/Главная/DoIt

Что я делаю неправильно?

EDIT: Очевидно, что я делаю что-то неправильно с атрибутом маршрута, потому что даже это не работает:

[Route("DoIt")] 

или

[Route("Home/DoIt")] 

Оба дают мне 404, независимо от того, запрос URL быть http://localhost/Home/DoIt или http://localhost/DoIt

ответ

4

порядка, в котором вы размещаете линию MapMvcAttributeRoutes. У вас это в неправильном месте. Он должен быть вызван до маршрута по умолчанию.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     // Add this to get attribute routes to work 
     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Маршрутизация работает как оператор с коммутацией. первый матч побед. Но если вы сначала поместите маршрут по умолчанию, он будет соответствовать каждому URL-адресу с 0, 1, 2 или 3 сегментами и эффективно отменяет любые маршруты атрибутов этих длин.

Ссылка: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#enabling-attribute-routing

+0

Да, это разрешено. Вопрос обновлен. –

+0

Да, именно так. Большое спасибо. –

0

Вы пробовали доступ к вашему действию непосредственно из браузера? Я имею в виду YourHost/Home/DoIt. Если он также вызывает ошибку 404, ваша проблема, вероятно, возникает из конфигурации вашего маршрута.

Возможно, у вас нет конфигурации атрибута маршрута.Проверьте следующее: Из MSDN:

Чтобы включить маршрутизацию атрибута, вызовите MapMvcAttributeRoutes во конфигурации.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapMvcAttributeRoutes(); 
    } 
} 
+0

Да, это включено. Вопрос обновлен. –

Смежные вопросы