2009-08-14 8 views
2

Je développe actuellement un exemple d'application dans MVC. La spécification est la suivante:
1. Vue partielle partielle pour une grille.
2. Le modèle sera typé à une liste d'objets de domaine afin que je puisse passer n'importe quoi à la grille
3. Je peux laisser tomber cette vue dans n'importe quelle page et décorer le contrôleur avec quelques attributs Je peux gérer la page suivante/prev actions.
4. Les actions de pagination seront transmises à un autre contrôleur et transmises au contrôleur principal.Passer une requête à un autre contrôleur sur HandleUnknownAction

Je suppose que ma question serait, Comment puis-je main de contrôle à un autre contrôleur dans le HandleUnknownAction et revenir avec un résultat de cet autre contrôleur pour remplir mon modèle dans l'appelant

Hope this sens

Rich

Répondre

0

Je suggère d'utiliser TempData pour gérer le renvoi du résultat en raison de sa durée de vie limitée.

La commande de transfert vers un autre contrôleur peut être effectuée de nombreuses façons.

On pourrait être

Redirect("/Controller/Action/SomePrametersToKnow/WhereToReturnTo")

Une autre pourrait être:

var controller - new OtherController(); 
controller.ActionMethod(parameters) 

HTH,

Dan

+0

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. –

0

Si je vous comprends bien, vous avez besoin de réutiliser la même logique du contrôleur de grille dans plusieurs autres contrôleurs. En effet, vous placez la vue partielle dans différentes pages aspx gérées par différents contrôleurs. Cette vue partielle doit cependant être desservie par le contrôleur de réseau et le contrôleur spécifique qui a produit cette vue. Par exemple, vous avez HomeController qui a la méthode Index qui présente Index.aspx avec votre grille dedans. Lorsque l'utilisateur appuie sur le bouton de la page gird, il doit lancer la méthode HomeController HandleUnknownAction, qui doit utiliser la logique GridController pour répondre à la demande de pagination.

Si cela est juste, je dériverais juste dans tous mes contrôleurs de GridController et alors je ferais la méthode de pagination virtuelle un afin que vous puissiez remplacer le HomeController.

Par exemple: GridController a méthode virtuelle ActionResult NextPage publique() » HomeController a.

public override ActionResult NextPage() 
{ 
    base.NextPage(); 
} 

De cette façon, vous pouvez exécuter les deux contrôleurs sans trop de codage supplémentaire

+0

Favoriser la composition sur l'héritage - forcer une autre couche dans la hiérarchie d'héritage pour fournir un accès à la logique qui peut ou non se rapporter à l'objectif de la classe feuille est une odeur de conception. Votre solution indique que HomeController est un GridController, mais la conception indique que le HomeController contient une action qui affiche une grille - deux instructions très différentes. – Neal

0

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.

Questions connexes