Как сохранить сложную строку запроса во время подкачки с использованием Html.RouteLink в MVC3 - PullRequest
3 голосов
/ 15 января 2012

У меня есть специализированная поисковая система, которая передает критерии поиска со страницы поиска (формы) на страницу результатов через длинную и сложную строку запроса (37 параметров) в URL. Это должно быть сделано таким образом, а не как публикация формы, потому что я хочу дать пользователям возможность создавать свои собственные поисковые запросы, создавая собственные URL-адреса.

Я обрабатываю пейджинг как параметр в URL, а не как часть строки запроса. Так, например, «/ Search / Results? Keyword = & ...» направляет на страницу 1, а «/ Search / Results / 6? Keyword = & ...» направляет на страницу 6 и т. Д. Я ищу способ сохранить строку запроса на всех страницах, но я не могу найти способ, чтобы RouteLink "заново" прикрепил входящую строку запроса к URL-адресу, который он генерирует. В некоторых сообщениях, которые я видел, предлагается явно прикреплять каждый параметр как «новый {}», но их 37, поэтому этот способ не будет практичным.

То, что я действительно хотел бы найти, это что-то вроде;

Html.RouteLink("Next", "Default", new { controller = "Search", action = "Results", page = nextPage, Request.QueryString });

но это не работает.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 15 января 2012

Это хороший кандидат для настраиваемого помощника по 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
    }
)
0 голосов
/ 15 января 2012

Создайте расширение ActionLink, которое добавит строку запроса к значениям маршрута, как ..

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 («Индекс», «Дом», «ссылка на дом»)

0 голосов
/ 15 января 2012

Как насчет этого:

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