Je pense que vous êtes. essayer d'utiliser le mauvais aspect pour faire le travail, c'est pourquoi vous trouvez qu'il est pénible à réaliser
Obtenir l'ensemble de la collection d'objets, puis de rendre un sous-ensemble d'entre eux est incroyablement gaspillage, h Comment savez-vous que votre utilisateur va regarder toutes les pages? Et s'il y a 10 000 objets?Vous voulez récupérer 2 informations dans la base de données, la première page d'objets et le nombre total d'objets - cela doit être géré par votre contrôleur (de préférence en appelant une forme de service plutôt que directement à la base de données mais c'est un argument pour un autre jour). Empilez cette information dans une classe qui contient tous les assistants de rendu dont vous avez besoin et envoyez cette classe à la vue. Compte tenu du nombre d'objets et de la taille de la page, vous pouvez créer des liens de navigation simples renvoyant à l'action qui transmet le nouveau numéro de page.
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()
{
}
}
Dans le contrôleur ...
// 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);
}
Quelque part dans la vue ...
<% =Html.RenderPartial("GridView", Model) %>
Dans la partie ...
<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>
S'il vous plaît noter, tout le code affiché est aircode et n'est pas garanti pour fonctionner, moi compter démontrer une série de concepts.
Salut Dan THanks pour votre réponse. Mon problème est que je gère les demandes de grille dans HandleUnknownAction. Je voudrais transmettre cette demande au GridController et retourner un GridModel de cet appel pour ensuite mettre à jour le GridModel dans mon contrôleur actuel. Je pense que je suis confus quant à l'endroit où stocker le GridModel. Vraiment je veux qu'il soit stocké dans le gridController et y avoir accès si nécessaire dans le contrôleur de l'appelant. Mon but est que toutes les demandes de grille soient traitées par le contrôleur de réseau via n'importe quel contrôleur. –