私はあなたがいると思います。間違ったアスペクトを使用して作業を実行しようとすると、達成するのは苦労します。
オブジェクトのコレクション全体を取得してサブセットをレンダリングするのは非常に無駄です。hあなたのユーザーがすべてのページを見ていることは分かっていますか? 10,000のオブジェクトがある場合はどうなりますか?
データベースから2つの情報、オブジェクトの最初のページ、オブジェクトの総数を取得する必要があります。これはコントローラから処理する必要があります(できれば直接別の日の議論である)。必要なレンダリングヘルパーを含むクラスにその情報をパッケージ化し、そのクラスをビューに送信します。オブジェクト数とページサイズが与えられれば、新しいページ番号を渡すアクションにポストバックする簡単なナビゲーションリンクを構築することができます。部分的...
<table>
<tr>
<% foreach(var column in Model.Columns) { %>
<th><% =column %></td>
<% } %>
</tr>
<% foreach(var item in Model.Items) { %>
<tr>
<% foreach(var column in Model.Columns) { %>
<td><% =Model.GetColumnValue(column, item) %></td>
<% } %>
<tr>
<% } %>
<tr>
<td colspan="<% =Model.Columns.Count %>">Showing Page <% =Model.CurrentPage %> of <% =Model.GetPageCount() %></td>
</tr>
<tr>
<td colspan="<% =Model.Columns.Count %>"><% =Model.GetPreviousLink() %> | <% =Model.GetNextLink() %></td>
</tr>
</table>
で
public class GridView<T>
{
private Dictionary<string, Func<T, string> _columnMap;
public GridView(IEnumerable<T> items, long totalItems, long currentPage)
{
Items = items;
Count = totalItems;
CurrentPage = currentPage;
}
public long Count { get; private set; }
public long CurrentPage { get; private set; }
public IEnumerable<string> Columns { get; }
public IEnumerable<T> Items { get; private set; }
public void AddColumn(string name, Func<T, string> data)
{
_columnMap.Add(columnName, data);
}
public string GetColumnValue(string name, T item)
{
var valueExtractor = _columnMap[name];
return valueExtractor(item);
}
public string GetPageCount()
{
// Calculate page count, convert to string and return
}
// Might be easier to make these two extension methods for the html helper class
// so that you get easier access to the context of the current action
public string GetPreviousLink()
{
}
public string GetNextLink()
{
}
}
コントローラで
...
// Use the route definition to set the page to default to 1
public ActionResult ShowProducts(int page)
{
// Get the list of products for the requested page
var currentPageData = ...
// Get the total number of products
var productCount = ...
var gridData = new GridView<Product>(currentPageData, productCount, page);
gridData.AddColumn("Name", p => p.ProductName);
gridData.AddColumn("Price", p => p.Price.ToString("c"));
gridData.AddColumn("In Stock", p => p.StockLevel.ToString());
return View(gridData);
}
どこかのビューで
...
<% =Html.RenderPartial("GridView", Model) %>
注意してください、示されたすべてのコードはaircodeであり、動作することは保証されていません。一連の概念を示しています。
こんにちはダン ご返信ありがとうございます。私の問題は、HandleUnknownActionでグリッド要求を処理することです。このリクエストをGridControllerに渡して、この呼び出しからGridModelを返して、現在のコントローラのGridModelを更新したいと思います。私はGridModelをどこに格納するかについて混乱していると思います。本当に私はそれがgridControllerに格納され、呼び出し元のコントローラに必要なときにアクセスできるようにします。私の目標は、グリッドコントローラーがANYコントローラーを介して処理するグリッド要求のすべての要求を持つことです。 私は意味を作っていることを願っています –