我有以下ActionMethod:
[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
但是,当值可选时,我想创建短链接(/ Message / List / 4)。
我已经检查并仔细检查参数的命名是否正确,但这不是问题...
我还添加了第二个List方法
[Route("List/{listType})]
public ActionResult List(int listType)
{
// Do Stuff
}
正确生成只有1个参数的链接,但是当我传入更多参数时,它们会生成如下:
/Message/List/4?listID=5
Offcourse routes.MapMvcAttributeRoutes();已添加到RegisterRoutes函数...
当我只传入1个参数时,我没有看到导致生成错误链接的原因是什么?
答案 0 :(得分:1)
我找到了一个(可能的)解决方案。
当我将以下内容添加到RouteConfig时,链接会正确生成:
routes.MapRoute(
name: "MessageList",
url: "Message/List/{listType}",
defaults: new { controller = "Message", action = "List", listType = 0 }
);
当只添加listType作为参数时,链接是/ message / list / 4,当我添加更多参数时,链接也是正确的! ActionMethod上的RouteAttribute仍然存在,所以他们现在一起工作。
不是我希望的解决方案,因为我想用路由属性来做。
答案 1 :(得分: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 }
);
}
}
路由是订单敏感的,必须从最具体到最不具体的方式声明才能工作。
答案 2 :(得分:0)
您应该尝试使用RouteLink而不是ActionLink。要使用RouteLink,你可以这样写:
@Html.RouteLink("MyLink", new {
controller = "Message",
action = "List",
listType = 4
})