2009-09-27 3 views
3

Я использую ASP.NET MVC в первый раз, и до сих пор все прошло отлично. Однако, один маленький вопрос, на который я надеялся, что кто-то может мне посоветовать.Согласование Querystring в ASP.NET MVC

Когда страница может выполнять несколько задач, и каждая из них обрабатывается на сервере, оценивая значения запроса, рекомендуемые решения для создания запроса по запросам.

Например, список товаров, которые пользователь может сортировать, переводить и фильтровать.

Пользователь выполняет своего рода - sortcolumn = пример

Пользователь меняет страницу в списке -? Sortcolumn = пример & страница = 3

Пользователь выполняет фильтр в списке -? Sortcolumn = пример & страница = 3 & фильтр = выр

в Actionlinks для каждой из этих задач совершенно отдельно от остальных, так что мне нужно routevalues ​​во всех выражениях Html.ActionLink.

Надеюсь, что тот сможет посоветовать.

ответ

4

Спасибо за помощь, ребята. Я закончил создание метода расширения на UrlHelper, чтобы легко создавать URL-адреса, которые требуют возврата всех активных данных url/querystring. Я сделал это, потому что использование stringbuilder было бы трудным начать изменять URL-адреса на основе совпадений в таблице маршрутизации.

, например /игроков/защитник/4 или игроков? Sortcolumn = защитник & страница = 4

Используя этот метод, я могу просто поставить все обратно в двигатель маршрутизации и дайте ему беспокоиться о том, какие части url должен быть сопоставлен с URL-адресом, который разделяет запрос.

using System.Web.Routing; 

namespace System.Web.Mvc 
{ 
    public static class UrlHelperExtensions 
    { 
     public static string RouteUrlIncludingQuerystring(this UrlHelper helper) 
     { 
      return helper.RouteUrlIncludingQuerystring(new RouteValueDictionary()); 
     } 

     public static string RouteUrlIncludingQuerystring(this UrlHelper helper, object routeValues) 
     { 
      return helper.RouteUrlIncludingQuerystring(new RouteValueDictionary(routeValues)); 
     } 

     public static string RouteUrlIncludingQuerystring(this UrlHelper helper, RouteValueDictionary routeValues) 
     { 
      RouteValueDictionary v = new RouteValueDictionary(); 

      foreach (var kvp in helper.RequestContext.RouteData.Values) 
       v[kvp.Key] = kvp.Value; 

      foreach (var kvp in helper.RequestContext.RouteData.DataTokens) 
       v[kvp.Key] = kvp.Value; 

      foreach (var key in helper.RequestContext.HttpContext.Request.QueryString.AllKeys) 
       v[key] = helper.RequestContext.HttpContext.Request.QueryString[key]; 

      foreach (var kvp in routeValues) 
       v[kvp.Key] = kvp.Value; 

      return helper.RouteUrl(v); 
     } 
    } 
} 
0

Посмотрите на помощнике пейджера от MvcContrib here подхода они используют зовют вспомогательный метод для создания линии связи, который будет перебирать текущие ключи строки запроса и добавить необходимые значения для навигации по страницам (не обращая внимания на текущую странице, но с сохранением другие параметры). Образец очень простой, поскольку он работает только для подкачки, но его можно легко расширить, включив в него сортировку и фильтрацию.

+0

Спасибо Ариэль, я подумал, что, возможно, был более умный способ сделать это, но похоже, что старый добрый строитель по-прежнему подходит. – WDuffy

2

Вы можете создать один маршрут, который попадает в конкретный метод контроллера, и просто добавлять параметры к методу контроллера по мере необходимости. Если параметр существует в запросе, метод контроллера поднимет его. Если параметр не существует в запросе, параметр в методе контроллера будет просто нулевым.

Пример:

public ActionResult ProductsBySystemIndex(int manufacturerID, string page, string sortOrder, string filter) 
    { 
     if (page != null) 
     { 
      // do something with page 
     } 
     // etc. 
    } 
Смежные вопросы