ActionLink 显示查询字符串而不是 URL 参数

ActionLink is showing query string instead of URL parameters

我的问题与其他问题非常相似。在 MVC .Net 4.5 中使用 ActionLink 时,我得到一个参数的查询字符串,而不仅仅是 URL 路径。我尝试了解决方案 HERE,但它没有用。

代码-

里面 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>

您需要调换路线的顺序。我还建议您在 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 }
);