操作链接在 中生成网址参数,而不是路径部分
本文关键字:路径部 参数 链接 操作 | 更新日期: 2023-09-27 18:31:42
我有以下操作方法:
[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 方法来创建操作链接时
@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
}
只有 1 个参数的链接正确生成,但是当我传入更多参数时,它们的生成方式如下:
/Message/List/4?listID=5
航线外路线。MapMvcAttributeRoutes();已添加到注册路由函数...
当我只传入 1 个参数时,我看不到哪个问题导致生成不正确的链接?
我找到了一个(可能的)解决方案。
当我将以下内容添加到路由配置时,链接会正确生成:
routes.MapRoute(
name: "MessageList",
url: "Message/List/{listType}",
defaults: new { controller = "Message", action = "List", listType = 0 }
);
当仅将 listType 添加为参数时,链接是/message/list/4,当我添加更多参数时,链接也是正确的!ActionMethod 上的 RouteAttribute 仍然存在,因此它们现在协同工作。
不是我希望的解决方案,因为我想使用路由属性来做到这一点。
我只能使用以下代码重现此问题:
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 }
);
}
}
路由是顺序敏感的,必须从最具体到最不具体进行声明才能正常工作。
您应该尝试 RouteLink 而不是 ActionLink。要使用RouteLink,你需要写这样的东西:
@Html.RouteLink("MyLink", new {
controller = "Message",
action = "List",
listType = 4
})