2009-02-27 6 views
39

私は別の並べ替えとフィルタリングを私のビューに適用したい 私は、並べ替えとフィルタリングを paramsをクエリ文字列に渡していると考えました:asp.net mvcでクエリ文字列パラメータにアクセスするにはどうすればよいですか?

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

フィルタリングを追加したいのですが、クエリ文字列が

で終わるようにしたい
?SortBy=Name&Filter=Something 

既存のクエリのリストに別のパラメータを追加するにはどうすればよいですか? ActionLinkのもの?例:

user requests /Index/ 

:最初は /Index/?SortBy=Nameのように見え、2番目は /Index/?FilterBy=Name

彼はいくつかのフィルタリングを適用した後にソートリンクを押した - フィルタリングは失われていないので、私は私のパラメータを組み合わせる方法が必要です。 私の推測では、クエリ文字列を解析しない方法がありますが、いくつかの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、モデルの表示 –

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

代わり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

の使用ActionLinkCombined私のソリューションは、qwerty1000年代に似ています。拡張メソッドActionQueryLinkを作成しました。これは、標準ActionLinkと同じ基本パラメータを取ります。 Request.QueryStringをループし、まだ見つからないパラメータをRouteValues辞書に追加します(必要に応じて元のクエリ文字列を上書きできます)。

は使用が可能な任意のキーを追加し、既存の文字列を保持しなくするには、次の

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

ユーザーは次のようになり、既存の文字列を保存し、新しいキーを追加するには:

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

以下のコード2つの用途のためですが、他のオーバーロードを追加して、必要に応じて他の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" }) 

OR

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

クエリ文字列は次のようになります:

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

それは​​

+0

この行' new {あなたがなぜ@記号を何回使用するのか@記号は予約されたキーワードのために使用されます。 – Thomas

関連する問題