MVC 3 — ActionLink

#asp.net-mvc #model-view-controller #routes

#asp.net-mvc #модель-представление-контроллер #маршруты

Вопрос:

Я использую метод RegisterRoutes в глобальном файле, чтобы перенаправить URL пользователя на фактический URL.

 routes.MapRoute("Blog", 
                "blog/dp/{id}", 
                 new { controller ="Blog", action = "Details" });
  

Как вы могли догадаться, Blog — это контроллер, а Details — его действие.

Итак, проблема в том, что следующий код не генерирует URL-адрес моего желания, в URL-адресе которого есть слово dp. Кстати, я не хочу менять название своего действия.

 @Html.ActionLink( "headline", "Details", "Blog", new { id="1200" }, null )
  

Заранее спасибо 😉

Комментарии:

1. Правильно ли маршрутизируется URL-адрес? Если вы введете URL http://site/blog/dp/1200 , приведет ли это к правильной странице? И есть ли у вас какие-либо другие маршруты, которые сопоставляются с тем же контроллером? Это может помочь включить все ваши маршруты в ваш вопрос.

2. Да, он перенаправляет на правильную страницу 😉 моя проблема в том, что actionlink генерирует этот » сайт / блог / Подробности? id = 1200 »

Ответ №1:

Вы могли бы использовать RouteLink вместо ActionLink. В RouteLink вы можете явно передать свое имя маршрута:

 @Html.RouteLink("headline", "Blog", new { controller = "Blog", action = "Details" })
  

Подробнее о методе RouteLink можно найти в MSDN. Изменение порядка маршрутов может выполнить эту работу, но это довольно хрупкий механизм.

Ответ №2:

ActionLink может использовать маршрут, отличный от того, который вы предоставляете в вопросе. Есть ли у вас какие-либо маршруты, объявленные до этого?

Маршруты сопоставляются в том порядке, в котором вы их предоставляете. Итак, например, если у вас было что-то вроде:

 routes.MapRoute("Blog", 
                "blog/dp",       // {id} is not provided in this one
                 new { controller ="Blog", action = "Details" });
  

объявленный перед этим маршрутом:

 routes.MapRoute("Blog", 
                "blog/dp/{id}", 
                 new { controller ="Blog", action = "Details" });
  

Сначала будет сопоставлен первый маршрут, и вы увидите /blog/dp /?id=1200 вместо /blog/ dp / 1200.

Комментарии:

1. Спасибо за ваш ответ, но мои MapRoutes работают нормально, и моя проблема в том, что actionlink не может быть использован в упомянутом сценарии. Кстати, я знаю, что могу обойти эту проблему с помощью тега <a> .