如何在MVC3中使用Html.RouteLink进行分页时保持复杂的查询字符串

时间:2012-01-15 16:18:18

标签: asp.net-mvc-3 asp.net-mvc-routing

我有一个专门的搜索引擎,它通过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 });

但这不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

这是自定义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
    }
)

答案 1 :(得分:0)

这个怎么样:

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

答案 2 :(得分:0)

创建一个ActionLink Extension,它将为路由值添加查询字符串, 像..

public static class LinkExtensions
    {
        public static string MyActionLink(this HtmlHelper helper,string actionName,string controllerName,string linkText)
        {
            var qs =helper.ViewContext.HttpContext.Request.QueryString;
            RouteValueDictionary dict=new RouteValueDictionary();
            qs.AllKeys.ToList().ForEach(k=>dict.Add(k,qs[k]));

            UrlHelper urlhelper = new UrlHelper(helper.ViewContext.RequestContext);

            string url = urlhelper.Action(actionName, controllerName, dict);
            TagBuilder tagBuilder = new TagBuilder("a")
            {
                InnerHtml = (!String.IsNullOrEmpty(linkText)) ? HttpUtility.HtmlEncode(linkText) : String.Empty
            };
            tagBuilder.MergeAttribute("href", url);
            return tagBuilder.ToString(TagRenderMode.Normal);

        }
    }

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

@ Html.MyActionLink(“索引”,“主页”,“链接到主页”)