如何使用Html.ActionLink创建查询字符串

时间:2014-06-17 13:47:41

标签: c# asp.net-mvc-3 razor

在我的mvc3 razor项目中,我有行动链接

@Html.ActionLink("ActionLinkName","Count","Home",new{id = 3})

这会生成localhost/Home/Count/3

但我希望它能够创建localhost/Home/Count?id=3

我应该在路线上做出哪些改变?

3 个答案:

答案 0 :(得分:2)

这是因为新MVC项目使用的默认路由包含{id}段。从默认路由中删除该段将使现有代码生成查询字符串。

改变这个:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

对此:

routes.MapRoute(
    "Default",                                     // Route name
    "{controller}/{action}",                       // URL with parameters
    new { controller = "Home", action = "Index" }  // Parameter defaults
    );

答案 1 :(得分:1)

由于Asp.Net注册的默认(回退)路由在url模式中包含{id}参数:

// Default
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

您生成的网址遵循此后备模式({controller}/{action}/{id})并使用id附加您的/{id}

您需要在默认路线之前注册自定义路线以排除{id}

routes.MapRoute(
    name: "Count",
    url: "Home/Count",
    defaults: new { controller = "Home", action = "Count" }
);

您还可以尝试从默认模式中移除{id}(如果它不会影响其他操作)或将id操作中的Count参数更改为不同的名字。

答案 2 :(得分:0)

从默认配置中删除{id}

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 }
    );
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}",
        defaults: new { 
            controller = "Home", 
            action = "Index" }
    );
}