MVCアプリケーションでページネーションとフィルタリングを行う方法
-
06-07-2019 - |
質問
martijn Boland's ページへ。
ページ番号をクリックすると、アプリのURLが変わります:
http://localhost:1202/Issue?page=6
これまでのところとても良い。
問題は、変更時に送信するドロップダウンリストを追加すると、ページングやフィルターができないことです。
ドロップダウンを変更する場合は、queryIdにprojectIdを渡す必要があります。partailビューが更新され、フィルター処理された再スコアが表示されます。
これで、ページを表示しても、フィルターパラメーターがクエリ文字列に固定されず、ドロップダウンの選択も固定されません。
ページングとフィルターの方法
Index.aspx
<form id="form-post-project-selection" class="post-comments" method="get">
<label for="Country">Project:</label>
<%= Html.DropDownList("ProjectList", "--All--") %>
</form>
<% Html.RenderPartial("MyIssues", Model); %>
<script type="text/javascript">
$("#form-post-project-selection").submit(function(evt) {
var frm = $("#form-post-project-selection");
var action = frm.attr("action");
var serializedForm = frm.serialize();
var projectId = jQuery.trim($("ProjectList").val());
if (projectId.length < 1 || projectId == "-1")
return;
});
$("#ProjectList").change(function() {
$("#form-post-project-selection").submit();
});
</script>
解決
ここにはいくつかのオプションがあると思います。
最初の方法は、Ajaxを使用してコントローラーにコールバックし、「Paged」を取得することです。出力をフィルタリングするたびに、フィルタIDをポストバックして、目的のページに必要な結果コレクションのみを取得します。 Ajaxでページングを行うこともできますし、Ajax呼び出しでフィルターIDを渡すことで、フィルター処理されページングされたオブジェクトを取得するか、以下で説明するページングで別のURLにリダイレクトできます。
ドロップダウンの値を変更する際にサーバーへの全ページポストバックを使用する場合、フィルターIDを含む別のURLにユーザーをリダイレクトできます。 Issue / Filter / 1
この方法では、ページングリンクが使用されるたびに、Issue / Filter / 1?page = 6のようなURLになり、フィルターを失うことはありません。
ページの表示は変更する必要がないことに注意してください。
関数は同じものになりますが、この質問に対する答えは下のコメントにあり、簡単にここに投稿できます。
<%= Html.Pager(ViewData.Model.PageSize, ViewData.Model.PageNumber, ViewData.Model.TotalItemCount, new { categoryname = ViewData["CategoryDisplayName"] } )%>