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

C# 如何使用Html.ActionLink创建查询字符串,c#,asp.net-mvc-3,razor,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 我应该对路由进行哪些更改?这是因为新MVC项目使用的默认路由包括一个{id}段。从默认路由中删除该段将使现有代码生成查询字符串 更改此项: routes.MapRoute( "Default",

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

@Html.ActionLink("ActionLinkName","Count","Home",new{id = 3})
这将生成
localhost/Home/Count/3

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


我应该对路由进行哪些更改?

这是因为新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
    );

从默认配置中删除
{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 }
    );
}

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

// Default
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
您生成的url遵循此回退模式(
{controller}/{action}/{id}
),并使用
/{id}
追加您的
id

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

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

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

是默认路由中的“id”参数告诉mvc这样创建url。您可以使用“id”以外的其他名称,或者更改路由以期望使用不同名称的参数。只是出于好奇:您为什么要这样做?我的客户想要那种链接。好吧,不管客户想要什么。。。但在我看来,这似乎是倒退。MVC使URL更易于用户和SEO友好,而查询字符串则不然。
routes.MapRoute(
    name: "Count",
    url: "Home/Count",
    defaults: new { controller = "Home", action = "Count" }
);