ActionLink生成url参数而不是路径部分

时间:2014-11-23 19:21:15

标签: c# asp.net-mvc routes actionlink

我有以下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个参数时,我没有看到导致生成错误链接的原因是什么?

3 个答案:

答案 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
})