2012-05-14 30 views
0

私は、このようなアクションメソッドを持っています。検索時にクエリ値を保存する方法は? ASP.NET MVC

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Search(String filter, String value, Int32? page) { 
    var set = new List<Employee>(); 
    switch(filter) { 
    case "by-name": { 
      set = this.repository.Get(
       e => (e.LastName + " " + e.FirstName + " " + e.MiddleName) == value 
      ).ToList(); 
      break; 
     } 
     case "by-empn": { 
      set = this.repository.Get(
       e => e.EmployeeNumber == value 
      ).ToList(); 
      break; 
     } 
     default: return RedirectToAction("Search", "Employee"); 
    } 

    ViewBag.SearchedEmployees = set.Count(); 
    return View(set.ToPagedList(page ?? 1, PageSize)); 
} 

検索ビューは、このようなものです:

@using(Html.BeginForm("Search", "Employee", FormMethod.Get, new { @class = "search-form" })) 
{ 
    <p> 
     @Html.TextBox("value") 
    </p> 
    <p> 
     @Html.RadioButton("filter", "by-name", true) By name <br/> 
     @Html.RadioButton("filter", "by-empn") By empn <br/> 
    </p> 
    <p> 
     <input type="image" src="@Url.Content("~/Content/Images/Search.png")" /> 
    </p> 
} 

問題:

@if(Model.Count > 0) { 
    foreach(var item in Model) { 
     Html.RenderPartial("Employee.Card", item); 
    } 

    @Html.PagedListPager(
     Model, 
     page => Url.Action("Search", new { page = page }), 
     new PagedListRenderOptions { 
      LinkToFirstPageFormat = "<< Beginning", 
      LinkToPreviousPageFormat = "< Back", 
      LinkToNextPageFormat = "Forth >", 
      LinkToLastPageFormat = "End >>" 
     } 
    ) 
} 

検索フォームを部分図として提示され:私はNページのリンクを持っています。私が第2ページに行くと、無限ループのリダイレクトに直面します。それが私の行動を実装した方法です。デフォルトのケースが発生します。したがって、filter/valueの値は、2回目のアクションコールでnullですか?どうして? 検索操作をどのようにリファクタリングするのですか?

また、このようなアクションのルートを設定するにはどうすればよいですか?

ありがとうございます!

routes.MapRoute(
    null, 
    "{controller}/{action}/Page{page}/filter{filter}/val{value}", 
    new { controller = "Employee", action = "Search" } 
); 

EDIT

だから、検索行動のためのルートは次のようになりますか?

EDIT 2

は、だから、次の書き込みすることが可能である:

page => Url.Action("Search", new { filter = ViewBag.SearchFilter, value = ViewBag.SearchValue, page = page }), 

とコントローラ内部:

public ActionResult Search(String filter, String value, Int32? page) { 

    ViewBag.SearchFilter = filter; 
    ViewBag.SearchValue = value; 
    // ... 
} 

は、この権利ですか?

答えて

1

したがって、2番目のアクションコールでは、フィルタ/値の値はnullですか?どうして?

対応する入力フィールドは別のフォームの中にあり、決してサーバーに送信されないためです。

あなたはカスタムのHtml.PagedListPagerヘルパー(あなたが示していないコード)を使用しているようですが、このヘルパーがアンカーとしてページリンクを生成し、現在のクエリ文字列を考慮していないか、それらのリンクを生成するときにPOSTされた値。そのため、ページ分割リンクのhrefは、/SomeController/Search?page=5&filter=somefilter&value=somevalueというパラメータを考慮に入れた正しいものではなく、/SomeController/Search?page=5のようになります。

コントローラアクション内のfiltervalueのパラメータが常にnullである理由を簡単に理解できるようになりました。これは、ページネーションリンクをクリックしたときにサーバーに送信しないためです。

この問題を解決するには、これらの追加パラメータを含むようにページネーションリンクを生成するために使用しているこのカスタムHTMLヘルパーを変更することができます。あるいは、ヘルパーは追加のパラメータを渡すことができますか?これが使用しているサードパーティ製のプラグインである場合は、ドキュメントを確認してください。

+0

1)私の編集を見てください。 2)私はTroy Goodeのページネーションリストを使用しています。私はこのようなものを書いた(EDIT 2)。 – lexeme

+0

これは、自分自身でURLを生成し、2つのパラメータを含めるための良い方法のようです。私は 'ViewBag'の代わりに強く型付けされたビューモデルを使用しますが、あなたがそれをより快適に感じるなら、それを使い続けてください。 –

+0

クール!また、私は最初の検索リクエストを作成するときに、このhttp:// localhost:51126/Employee/Search/Page2?value =%D0%A6%D0%A2%D0%94&filter = by-dept&x = 24&y = 13である。そして、「x」と「y」がどこから来たのか分かりません。対応する行動の経路をどうやって結ぶのですか? – lexeme

関連する問題