2014-11-23 2 views
1

я получил следующую ActionMethod:ActionLink генерирует параметры URL в пути вместо части

[Route("List/{listType}/{listID?}/{pageNumber?}/{pageSize?}/{output?}")] 
public ActionResult List(int listType, int listID = 0, int pageNumber = 0, int pageSize = 10, string output = "html") 
{ 
// Do Stuff 
} 

Требуется первый параметр, остальное не является обязательным.

Когда я звоню следующий по умолчанию метод MVC для создания ActionLink

@Html.ActionLink("MyLink", "List", "Message", new { listType = 4 }, null) 

ссылка генерируется на:

/Message/List?listType=4 

Я предположил, что это должно быть:

/Message/List/4 

Когда Я нажимаю ссылку, я получаю страницу ошибки 404, что страница не найдена.

Когда я прохожу в значение по умолчанию для второго параметра

@Html.ActionLink("MyLink", "List", "Message", new { listType = 4, listID = 0 }, null) 

Ссылка генерируется правильно:

/Message/List/4/0 

Однако, если значение необязательно, я хочу, чтобы создать короткую ссылку (/ Сообщение/Список/4).

Я проверил и проверил, правильно ли именование параметра, но это не проблема ...

Я также добавил второй метод List

[Route("List/{listType})] 
public ActionResult List(int listType) 
{ 
// Do Stuff 
} 

ссылка только один параметр генерируется правильно, но когда я перейти в более параметров, они генерируются как:

/Message/List/4?listID=5 

Offcourse routes.MapMvcAttributeRoutes(); был добавлен в функцию RegisterRoutes ...

Какую проблему я не вижу, из-за чего возникает некорректная ссылка, когда я передаю только один параметр?

ответ

0

я только был в состоянии воспроизвести эту проблему с помощью следующего кода:

public class RouteConfig 
{ 
    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(); 
    } 
} 

И исправить это с помощью этого кода:

public class RouteConfig 
{ 
    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 } 
     ); 
    } 
} 

маршруты порядка чувствительны и должны быть объявлены с наиболее специфическими для наименее конкретный для работы.

+0

К сожалению, это уже как мой RouteConfig настроен. Я заметил, что когда я использую @ Html.ActionLink («MyLink», «List», «Message», new {id = 4}, null) Ссылка работает как ожидалось (/ message/list/4), однако, когда я добавляю еще один параметр, они добавляются как параметр в URL (/ message/list/4? ListID = 8) – Barry

1

Я нашел (возможное) решение.

Когда я добавить следующий код в RouteConfig, ссылки генерируются правильно:

routes.MapRoute(
    name: "MessageList", 
    url: "Message/List/{listType}", 
    defaults: new { controller = "Message", action = "List", listType = 0 } 
); 

Когда только listType добавляется в качестве параметра ссылка/сообщение/список/4, и когда я добавить больше параметров, ссылка также правильная! RouteAttribute на ActionMethod все еще существует, поэтому они теперь работают вместе.

Не решение, на которое я надеялся, потому что я хотел бы сделать это с атрибутом маршрута.

0

Вы должны попробовать RouteLink вместо ActionLink. Чтобы использовать RouteLink, вы должны написать примерно следующее:

@Html.RouteLink("MyLink", new { 
    controller = "Message", 
    action = "List", 
    listType = 4 
}) 

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

  • Нет связанных вопросов^_^