JavaScript を使用しない回避策を次に示します。
私が見ている問題は、ページング リンクが、検索フィルターのように保存する必要があるルート情報を受信しないことです。IMOこれは露骨な見落としです!ここで少し余分に考えれば、多くの頭痛が解消されたはずです!
この手法は、WebGrid の組み込みページングを「破棄」し、ヘルパーを使用して必要な貴重なルート データと共にページング リンクを生成します。
完了したら、WebGrid をグリッドのみとしてレンダリングし、ヘルパーを使用してページング リンクを作成します。ここでの利点の 1 つは、それらを上下に配置できることです。
NuGet がソリューションに入れる Pager.css で提供されているものと同様の CSS を使用しようとしました。ヘルパーは一部の人にとっては十分に完成しているはずですが、簡単に拡張できます。
新規 新規 新規Ajax バージョンでヘルパーを更新しました。私は Razor ヘルパーに少し慣れていないので、一般的なテンプレートを使用するようにリファクタリングする方法がわかりませんでした。誰かお願いします?重要な追加の詳細は、渡しAjaxOptions
て必ずPOST
動詞として使用することです。そうしないと、正しいコントローラー メソッドにならない可能性があります。
ヘルパー (App_Code/LocalHelpers.cshtml):
@helper DoPager(System.Web.Mvc.HtmlHelper hh, string pageActionName, WebGrid grid, int maxPageLinks, object rvd) {
<div class="pager">
<div class="pageof">Page <b>@(grid.PageIndex + 1)</b> of <b>@grid.PageCount</b></div>
@if (grid.PageCount > 1) {
<ul>
<li>
@{ RouteValueDictionary rvdp1 = new RouteValueDictionary(rvd);
rvdp1.Add("Page", 1);
}
@hh.ActionLink("<<", pageActionName, rvdp1)
</li>
@{ int start = Math.Max(0, grid.PageIndex - maxPageLinks / 2); }
@for (int ix = 0; ix + start < grid.PageCount; ix++) {
int pageno = start + ix + 1;
var css = hh.Raw(pageno - 1 == grid.PageIndex ? " class=\"highlighted\"" : "");
RouteValueDictionary rvdp = new RouteValueDictionary(rvd);
rvdp.Add("Page", pageno);
<li@css>
@hh.ActionLink(pageno.ToString(), pageActionName, rvdp)
</li>
if (ix >= maxPageLinks) { break; }
}
<li>
@{ RouteValueDictionary rvdpX = new RouteValueDictionary(rvd);
rvdpX.Add("Page", grid.PageCount);
}
@hh.ActionLink(">>", pageActionName, rvdpX)
</li>
</ul>
}
</div>
}
@helper DoAjaxPager(System.Web.Mvc.AjaxHelper aa, System.Web.Mvc.Ajax.AjaxOptions aopts, System.Web.Mvc.HtmlHelper hh, string pageActionName, WebGrid grid, int maxPageLinks, object rvd) {
<div class="pager">
<div class="pageof">Page <b>@(grid.PageIndex + 1)</b> of <b>@grid.PageCount</b></div>
@if (grid.PageCount > 1) {
<ul>
<li>
@{ RouteValueDictionary rvdp1 = new RouteValueDictionary(rvd);
rvdp1.Add("Page", 1);
}
@aa.ActionLink("<<", pageActionName, rvdp1, aopts)
</li>
@{ int start = Math.Max(0, grid.PageIndex - maxPageLinks / 2); }
@for (int ix = 0; ix + start < grid.PageCount; ix++) {
int pageno = start + ix + 1;
var css = hh.Raw(pageno - 1 == grid.PageIndex ? " class=\"highlighted\"" : "");
RouteValueDictionary rvdp = new RouteValueDictionary(rvd);
rvdp.Add("Page", pageno);
<li@css>
@aa.ActionLink(pageno.ToString(), pageActionName, rvdp, aopts)
</li>
if (ix >= maxPageLinks) { break; }
}
<li>
@{ RouteValueDictionary rvdpX = new RouteValueDictionary(rvd);
rvdpX.Add("Page", grid.PageCount);
}
@aa.ActionLink(">>", pageActionName, rvdpX, aopts)
</li>
</ul>
}
</div>
}
意見:
<center>
@LocalHelpers.DoPager(Html, "Index", grid, 10, new { CurrentFilter = ViewBag.CurrentFilter })
</center>
@grid.Table(
tableStyle: "centerit",
columns: grid.Columns(
grid.Column(format: @<span>@Html.ActionLink("Edit", "Edit", new { id = item.ID }) | @Html.ActionLink("Details", "Details", new { id = item.ID }) | @Html.ActionLink("Delete", "Delete", new { id = item.ID })</span>),
grid.Column("PartNumber", "Part Number"),
grid.Column("Description", "Description"),
grid.Column("Regex", "Regex")
)
)
<center>
@LocalHelpers.DoPager(Html, "Index", grid, 10, new { CurrentFilter = ViewBag.CurrentFilter })
</center>
私の見解では、何をフィルタリングするかを知るために「CurrentFilter」をリサイクルしています。これは、コントローラ アクション (図示されていません) に接続します。