2016-07-11 5 views
0

Мой вопрос очень похож на другие вопросы. При использовании ActionLink в MVC .Net 4.5, я получаю строку запроса для одного параметра, а не только путь URL. Я попробовал решение HERE, но это не сработало.ActionLink показывает строку запроса вместо параметров URL

code-

Внутри RouteConfig.cs -

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

    routes.MapRoute(
      name: "MyControllerRoute", 
      url: "{controller}/{action}/{id}/{description}", 
      defaults: new { controller = "MyController", action = "MyAction", id = UrlParameter.Optional, description = UrlParameter.Optional } 
     ); 

Внутри HomeController.cs -

public ActionResult Index(){ 
    --do stuff-- 
    return View(); 
} 

Внутри MyController.cs -

public ActionResult Vote(int id, string description){ 
    --do stuff-- 
    return View(); 
} 

Внутри Index.cshtml

@Html.ActionLink(
     "This is stuff", 
     "MyAction", 
     "MyController", 
     new { id = 123, description = "This-is-stuff" }, 
     null) 

ПОЛУЧЕНИЕ Этот результат - (НЕ ТО, ЧТО Я ХОЧУ)

<a href="/MyController/MyAction/123?description=This-is-stuff">This is stuff</a> 

желаемому результату - (Как я могу получить это?)

<a href="/MyController/MyAction/123/This-is-stuff">This is stuff</a> 
+1

Переместить 'MyControllerRoute' перед маршрутом по умолчанию. И удалите 'id = UrlParameter.Optional, description = UrlParameter.Optional' с маршрута' MyControllerRoute' (только последний параметр можно пометить как необязательный –

+0

Это сработало, спасибо Стивен! Вы хотите сделать «официальный» ответ, чтобы я может дать вам кредит? Если нет, я сделаю официальный ответ для других, чтобы ссылаться. –

+0

Причина, по которой я еще не добавил ответа, состоит в том, что его непонятно, почему вы отметили оба параметра в маршруте MyControllerRoute как необязательный. там когда-либо был случай, когда вы бы указали только «id» или «description»? (в этом случае вам понадобится другое решение) –

ответ

1

Вам необходимо поменять порядок маршрутов. Я также рекомендовал бы использовать имя контроллера (и, возможно, имя действия) в определении URL-адреса, чтобы предотвратить возможные конфликты с другими маршрутами. Кроме того, только последний параметр может быть помечен как UrlParameter.Optional (иначе, если бы был предоставлен только один из параметров, маршрут был бы проигнорирован, и URL-адрес вернется к использованию значений строки запроса). Ваши определения должны быть (в порядке)

routes.MapRoute(
    name: "MyControllerRoute", 
    url: "MyController/MyAction/{id}/{description}", 
    defaults: new { controller = "MyController", action = "MyAction" } 
); 

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

Спасибо так много для этого, Стивен. Не могли бы вы объяснить, почему этот порядок имеет значение и почему он испортил URL? –

+0

Когда вы используете 'ActionLink()' (или любые другие методы tha t генерировать URL-адреса), метод ищет словарь маршрутов, генерируемый вашими определениями маршрутов, и проходит через них в том порядке, в котором они определены, и прекращает поиск, как только будет найдено совпадение, поэтому порядок значителен. [Эта статья] (https://msdn.microsoft.com/en-us/library/cc668201.aspx) - раздел, озаглавленный «Как совпадают URL-адреса маршрутов» - объясняет поведение. –

+0

Пытался найти Атрибут Маршрутизация в этой статье без успеха. Можете ли вы рассказать нам @StephenMuecke, где атрибуты маршрутов влияют на «порядок»? –

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