操作链接在 中生成网址参数,而不是路径部分

本文关键字:路径部 参数 链接 操作 | 更新日期: 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
})