Asp.net mvc 3 如何在MVC3中使用Html.RouteLink分页时持久化复杂查询字符串

Asp.net mvc 3 如何在MVC3中使用Html.RouteLink分页时持久化复杂查询字符串,asp.net-mvc-3,asp.net-mvc-routing,Asp.net Mvc 3,Asp.net Mvc Routing,我有一个专门的搜索引擎,它通过URL中的长而复杂的查询字符串(37个参数)将搜索条件从搜索页面(表单)传递到结果页面。必须这样做,而不是作为一个表单帖子,因为我想让用户能够通过构建自定义URL来编写自己的搜索查询 我将分页作为URL中的参数处理,而不是作为查询字符串的一部分。例如“/Search/Results?keyword=&…”指向第1页,“/Search/Results/6?keyword=&…”指向第6页,等等。我正在寻找一种方法在页面间持久保存查询字符串,但我似乎找不到RouteLi

我有一个专门的搜索引擎,它通过URL中的长而复杂的查询字符串(37个参数)将搜索条件从搜索页面(表单)传递到结果页面。必须这样做,而不是作为一个表单帖子,因为我想让用户能够通过构建自定义URL来编写自己的搜索查询

我将分页作为URL中的参数处理,而不是作为查询字符串的一部分。例如“/Search/Results?keyword=&…”指向第1页,“/Search/Results/6?keyword=&…”指向第6页,等等。我正在寻找一种方法在页面间持久保存查询字符串,但我似乎找不到RouteLink将传入查询字符串“重新附加”到它生成的URL的方法。我看到的一些帖子建议将每个参数显式地附加为“new{}”,但其中有37个参数,因此这种方法不实用

我真正想找到的是:

Html.RouteLink("Next", "Default", new { controller = "Search", action = "Results", page = nextPage, Request.QueryString });
但这不起作用

有什么建议吗?

这个怎么样:

<a href="@Url.RouteUrl(new 
        {
            controller = "Search", 
            action = "Results", 
            page = nextPage
         }
     )?@Request.QueryString">Next</a>

创建一个ActionLink扩展,将querystring添加到路由值中, 像

在视图中,您可以将其用作


@MyActionLink(“索引”、“主页”、“链接到主页”)

这是定制Html助手的一个很好的候选者:

public static class HtmlExtensions
{
    public static IHtmlString MyRouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, object routeValues)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var request = htmlHelper.ViewContext.HttpContext.Request;
        var url = urlHelper.RouteUrl(routeName, routeValues, request.Url.Scheme);
        var uriBuilder = new UriBuilder(url);
        var query = HttpUtility.ParseQueryString(string.Empty);
        foreach (string key in request.QueryString.Keys)
        {
            query[key] = request[key];
        }
        var routeQuery = HttpUtility.ParseQueryString(uriBuilder.Query);
        foreach (string key in routeQuery)
        {
            query[key] = routeQuery[key];
        }
        uriBuilder.Query = query.ToString();
        var anchor = new TagBuilder("a");
        anchor.Attributes["href"] = uriBuilder.ToString();
        anchor.SetInnerText(linkText);
        return new HtmlString(anchor.ToString());
    }
}
您将在您的视图中使用:

@Html.MyRouteLink(
    "Next", 
    "Default", 
    new { 
        controller = "Search", 
        action = "Results", 
        page = nextPage
    }
)

在最终的url中,您将得到多个
。一个是RouteUrl帮助程序返回的,后面是您硬编码的。@DarinDimitrov,即使
page
是路由参数?有什么问题吗?以及RouteUrl生成的querystring参数?否,如果页面是路由参数,则不会出现问题。但是,在一个视图中编写依赖于某个东西是否是路由参数的代码似乎非常脆弱。唯一应该处理路由的地方是RegisterRoutes方法。其他所有内容都应该是html/url帮助程序,具体取决于此方法中完成的配置。如果有人决定改变“<代码>页< /COD>参数”不再是路由参数,如果您硬编码这样的代码,则必须修改所有视图以使其有效。如果路由PARAM被单元测试支持,那么您是否认为它是脆弱的?要求我在这里接受教育。我个人尽量避免使用自定义帮助程序和Html帮助程序。对我来说,在视图中保留尽可能多的真实HTML使其更易于阅读,而不必破译帮助器方法args,它通常具有过载爆炸。当然,在这种情况下,您也可以使用url帮助器,因为正如您所说的,我们需要的只是url。但是,由于编写这个url逻辑是一个复杂的部分,您确实可以将其外部化到一个单独的url帮助程序中,然后从自定义html帮助程序调用它。为什么是HTML助手?因为我更喜欢在我的视图
@Html.MyRouteLink(…)
中编写,而不是使用一些标签汤:
。但那只是我。如果您喜欢这种语法,url助手也可以。我只是表达了当我回答某个问题时我会做什么,而且常常是主观的。这非常有效-我喜欢它自动移植查询字符串,而不必将其作为值传递。非常感谢^=
@Html.MyRouteLink(
    "Next", 
    "Default", 
    new { 
        controller = "Search", 
        action = "Results", 
        page = nextPage
    }
)