2009-05-20 1 views
12

asp.net mvcでクエリ文字列の値を保持する良い方法はありますか?どのようにasp.net mvcでクエリ文字列の値を保持しますか?

私はURLがある場合:? /質問に、私はすべてのものクエリ文字列の値を維持したいページングリンクでページ= 2 &ソート=最新&項目= 50 & showcomments = 1 &検索= ABCD

ユーザーが「次のページ」をクリックしたときにそのリンクが維持されるようにします(この場合、ページの値は変更されますが、残りは同じままです)。

私はこれを行う2つの方法を考えることができます:

    コントローラから
  1. ビューの場合、Request.QueryStringとリンクに値を追加
  2. 峠各クエリ文字列値は、バックビューへのViewData

を使用すると、他よりも良い1ですか?それらは唯一の選択肢ですか、これを行うためのより良い方法がありますか?

答えて

6

私が代わりに、コントローラからそれを渡すので、(あなたのオプション#1)ビューでのQueryStringを処理します。このアプローチでは、ビューをより自蔵的にすることができ、ビューコントロールに変換してさまざまなビュー間で再利用することができます。

注:ビューで直接QueryStringにアクセスすると、モデルとビューを分離する設計原則に違反しているように見えるかもしれませんが、実際にはこのデータはビューに関連するナビゲーション上の問題です。モデル。

+0

入力と推論に感謝します。あなたのメモは、まさに私がViewDataを渡すことを考えた理由です。 – dtc

1

私は、ページングリンクだけが持つ必要があるようにセッションの値を保持しています。

/質問?ページ= 2

/質問?ページ= 3

私は、ユーザーが見たいと思っていないためのQueryStringである理由私たちではないだろう一つの理由私がプログラムに渡している値。アドレスバーに入り、値が「何が起こるか」を見るように変更するのは簡単です。このコードでは、ページ番号を変更するだけです。

+0

これは私が一瞬考えていたものですが、それをクエリ文字列に残したかったのです。 – dtc

+0

クエリ文字列に&sort = newest&items = 50&showcomments = 1&search = abcdを残しておきたいというのは、人々が検索をブックマークできるようにするためです。あなたが人々に照会の&search =値を直接編集して何が起こるかを見せたくない理由がありますか? –

8

私はそのための拡張メソッドを使用します。

public static string RouteLinkWithExtraValues(
     this HtmlHelper htmlHelper, 
     string name, 
     object values) 
    { 
     var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values); 

     var extraValues = new RouteValueDictionary(values); 
     foreach (var val in extraValues) 
     { 
      if (!routeValues.ContainsKey(val.Key)) 
       routeValues.Add(val.Key, val.Value); 
      else 
       routeValues[val.Key] = val.Value; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form) 
     { 
      routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key]; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString) 
     { 
      if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "") 
       routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key]; 
     } 

     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name); 
    } 
+0

私はこれを考えなかった。面白そうですが、私にとっては複雑すぎるかもしれません。私はコードの行を記述することなくこれを行ういくつかのMVC規約があることを望んでいた。 – dtc

+0

スーパー! :thumbsup: – Haroon

0

ここで、私はAsp.Netコアでそれを行ってみましょう最初のコントローラ内でViewBagsにクエリ文字列パラメータを割り当てる:

[HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")] 
public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId) 
{ 
    ViewBag.CategoryId = categoryId; 
    ViewBag.ContractTypeId = contractTypeId; 
    ViewBag.LocationId = locationId; 

    ... 
} 

そして、そのようなあなたのリンクに値を渡す:

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@teachingCategory.Id" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @teachingCategory.Description (@teachingCategory.Rank) 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@typeOfEmployment.Id" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @typeOfEmployment.Name 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@item.Id"> 
    @item.Id 
</a> 

すべてのリンクは独自の実際の値を保持し、残りのルート値はViewBagに渡したものを通すことに注意してください。

関連する問題