2009-02-27 3 views
39

Я хочу иметь различные сортировки и фильтрации применяется на мой взгляд я понял, что я буду проездом сортировки и фильтрации Params через строку запроса:Как получить доступ к параметрам строки запроса в asp.net mvc?

@Html.ActionLink("Name", "Index", new { SortBy= "Name"}) 

Эта простая конструкция позволяет мне разобраться. Просмотр возвращается с этим в строке запроса:

?SortBy=Name 

Теперь я хочу, чтобы добавить фильтрацию и я хочу, чтобы моя строка запроса в конечном итоге с

?SortBy=Name&Filter=Something 

Как я могу добавить еще один параметр в списке уже существующих в ActionLink? для примера:

user requests /Index/ 

точка зрения

@Html.ActionLink("Name", "Index", new { SortBy= "Name"}) 

и

@Html.ActionLink("Name", "Index", new { FilterBy= "Name"}) 

Ссылки: Первый выглядит как /Index/?SortBy=Name, а второй /Index/?FilterBy=Name

Я хочу, когда пользователь нажатая сортировочная ссылка a fter он применил некоторую фильтрацию - фильтрация не потеряна, поэтому мне нужен способ объединить мои параметры. Я предполагаю, что должен быть способ не разобрать строку запроса, а получить набор параметров из некоторого объекта MVC.

+0

Как насчет обновления синтаксиса бритвы к вопросу? – MrBoJangles

+1

там вы идете .. только взял меня 4 года .. (-: –

ответ

29

до сих пор лучший способ, который я выяснил, - создать копию ViewContext.RouteData.Values и ввести в него значения QueryString. , а затем изменить его перед каждым использованием ActionLink. все еще пытается выяснить, как использовать .Union() вместо изменения словаря все время.

<% RouteValueDictionary tRVD = new RouteValueDictionary(ViewContext.RouteData.Values); %> 

<% foreach (string key in Request.QueryString.Keys) 
    { 
     tRVD[key]=Request.QueryString[key].ToString(); 
    } %> 

<%tRVD["SortBy"] = "Name"; %> 
       <%= Html.ActionLink("Name", "Index", tRVD)%> 
+0

Другой [вопрос] (http://stackoverflow.com/questions/391023/make-namevaluecollection-accessible-to-linq-query/396504) указывает, что это лучший способ при использовании '@ Html.ActionLink'. Я установил для' Name '. – Grastveit

+8

Любой лучший способ сделать это с помощью ASP.NET MVC 3 или 4? –

+0

@LenielMacaferi, View models –

8
<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %> 

Чтобы сохранить строку запроса, вы можете:

<%= Html.ActionLink("Name", "Index", 
    String.IsNullOrEmpty(Request.QueryString["SortBy"]) ? 
     new { Filter = "Something" } : 
     new { SortBy=Request.QueryString["SortBy"], Filter="Something"}) %> 

Или если у вас есть несколько параметров, можно создать ссылку вручную с помощью принимая во внимание Request.QueryString.

4

Использование ActionLinkCombined вместо ActionLink

 public static string ActionLinkCombined(this HtmlHelper htmlHelper, string linkText, string actionName, 
              object routeValues) 
    { 
     var dictionary = new RouteValueDictionary(); 
     foreach (var pair in htmlHelper.ViewContext.Controller.ValueProvider) 
      dictionary[pair.Key] = pair.Value.AttemptedValue; 
     if (routeValues != null) 
     { 
      foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(routeValues)) 
      { 
       object o = descriptor.GetValue(routeValues); 
       dictionary[descriptor.Name] = o; 
      } 
     } 
     return htmlHelper.ActionLink(linkText, actionName, dictionary); 
    } 
12

Мое решение аналогично qwerty1000 годов. Я создал метод расширения, ActionQueryLink, который принимает те же основные параметры, что и стандарт ActionLink. Он зацикливается на Request.QueryString и добавляет все найденные параметры в словарь RouteValues, которые еще не присутствуют (поэтому при необходимости мы можем перезаписать исходную строку запроса).

Чтобы сохранить существующую строку, но не добавлять никаких ключей использование будет:

<%= Html.ActionQueryLink("Click Me!","SomeAction") %> 

Чтобы сохранить существующую строку и добавить новые ключи пользователь будет:

<%= Html.ActionQueryLink("Click Me!","SomeAction", new{Param1="value1", Param2="value2"} %> 

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

public static string ActionQueryLink(this HtmlHelper htmlHelper, 
     string linkText, string action) 
    { 
     return ActionQueryLink(htmlHelper, linkText, action, null); 
    } 

    public static string ActionQueryLink(this HtmlHelper htmlHelper, 
     string linkText, string action, object routeValues) 
    { 
     var queryString = 
      htmlHelper.ViewContext.HttpContext.Request.QueryString; 

     var newRoute = routeValues == null 
      ? htmlHelper.ViewContext.RouteData.Values 
      : new RouteValueDictionary(routeValues); 

     foreach (string key in queryString.Keys) 
     { 
      if (!newRoute.ContainsKey(key)) 
       newRoute.Add(key, queryString[key]); 
     } 
     return HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, 
      htmlHelper.RouteCollection, linkText, null /* routeName */, 
      action, null, newRoute, null); 
    } 
2

MVC4

@Html.ActionLink("link text","action",new { @id = 5, @name = "textName", @abc = "abc" }) 

ИЛИ

@Html.ActionLink("link text", "action", "controller", new { @id = 5, @name = "textName", @abc = "abc" }, new { @class = "cssClass" }) 

QueryString будет, как:

yourDomainRout/action/5?name=textName&abc=abc 

у него было бы class="cssClass"

+0

см. эту строку' new { @id = 5, @name = "textName", @abc = "abc"} 'почему вы используете знак @ много раз. @ sign используется для зарезервированного ключевого слова. – Thomas

Смежные вопросы