Я думаю, что вы. пытаясь использовать неправильный аспект для выполнения работы, поэтому вам становится больно достигать.
Получение всей коллекции объектов, а затем их подмножество невероятно расточительно, h Вы знаете, что ваш пользователь будет смотреть на все страницы? Что, если 10 000 объектов?
Вы хотите получить 2 части информации из базы данных, первую страницу объектов и счетчик общего количества объектов - это должно быть обработано с вашего контроллера (желательно путем вызова в какой-либо форме обслуживания, а не непосредственно к базе данных, но это аргумент за другой день). Упакуйте эту информацию в класс, который содержит любые вспомогательные средства рендеринга, которые вам нужны, и отправьте этот класс в представление. Учитывая количество объектов и размер страницы, вы можете создавать простые навигационные ссылки, которые возвращаются к действию, передающему новый номер страницы.
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) %>
В парциальное ...
<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>
Пожалуйста, обратите внимание, весь показанный код - это воздушный код и не гарантированно работает, меня полагайтесь на ряд концепций.
Hi Dan Спасибо за ваш ответ. Моя проблема в том, что я обрабатываю запросы сетки в HandleUnknownAction. Я хотел бы передать этот запрос в GridController и вернуть GridModel из этого вызова, а затем обновить GridModel в моем текущем контроллере. Я думаю, я смущаюсь о том, где хранить GridModel. На самом деле я хочу, чтобы он хранился в gridController, а затем имел доступ к нему, когда это необходимо в контроллере вызывающего абонента. Моя цель - получить все запросы на запросы сетки, обрабатываемые gridcontroller через ЛЮБОЙ контроллер. Надеюсь, что я нахожу смысл. – 2009-08-17 09:34:55