2010-08-05 4 views
0

Contexte:
J'essaie d'implémenter un contrôle de tabulation. Les onglets sont les suivants:Comment implémenter un contrôle onglet dans lequel chaque onglet est une entité paginée générique?

| Funds | Companies | Groups | 

et sont mises en œuvre comme suit:

<ul class="ActionControl"> 

    <li> 
     <%=Html.ActionLink(string.Format("Funds ({0})", Model.Summary.FundCount) 
      , "ResultsList", new {selectedTab = "Funds"}) %> 
    </li> 
    // more tabs removed for brevity, one <li> for each 
</ul> 

Chaque onglet est un lien vers une méthode d'action, qui est défini comme:

public PartialViewResult ResultsList(SearchViewModel search) 
{ 
    var result = new SearchViewModel 
    { 

     Summary = _entitySearchService.GetSearchDataSummary(search.SearchExpression), 
     PagedFunds = _fundService.GetPagedEntitiesByName<Fund>(10, search.SearchExpression), 
     PagedCompanies = _companyService.GetPagedEntitiesByName<Company>(10, search.SearchExpression), 
     PagedGroups = _groupService.GetPagedEntitiesByName<CompanyGroupInfo>(10, search.SearchExpression) 
    }; 
} 

Cela fonctionne , mais ce n'est pas correct, parce que je veux seulement ramener des données pour l'onglet sur lequel on clique. Il est possible pour moi de faire un switch() sur la valeur stockée dans search.SelectedTab et de remplir uniquement la propriété associée à l'onglet cliqué, mais c'est en désordre. En outre, cela présente un problème dans la vue partielle, car je dois différencier les onglets pour identifier celui avec lequel je devrais remplir la table. À l'heure actuelle voici comment je alimenter le panneau de résultats si vous avez cliqué sur l'onglet Fonds:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SearchViewModel>" %> 

<% Html.RenderPartial("Tabs"); %> 

<table> 

    <% foreach (var item in Model.PagedFunds) {%> 

     <tr> 
      <td><%= item.Name %></td> 
     </tr> 

    <% }%> 

</table> 

Pour référence, c'est SearchViewModel:

public class SearchViewModel 
{ 
    public string SearchExpression { get; set; } 
    public string SelectedTab { get; set; } 

    public SearchDataSummary Summary { get; set; } 

    public Paging<Fund> PagedFunds { get; set; } 
    public Paging<Company> PagedCompanies { get; set; } 
    public Paging<CompanyGroupInfo> PagedGroups { get; set; } 
} 

et la signature de Paging est:

public class Paging<T> : List<T> // contains functionality to manage paging and act like a List<T> 

Question:
Quelle est la meilleure façon pour moi d'aborder ce problème?

Dois-je avoir des méthodes d'action distinctes pour chaque onglet? Donc, en cliquant sur Funds va

public PartialViewResult Funds(SearchViewModel search) 

et retourne ViewUserControl<Paging<Fund>>

et en cliquant sur Companies va à

public PartialViewResult Companies(SearchViewModel search) 

et retourne ViewUserControl<Paging<Company>>

Idéalement je pourrais garder la méthode d'action ResultsView unique et une approche plus générique pour renvoyer les articles paginés. Je pense que c'est possible mais je suis trop enlisé dans les détails et je ne suis pas capable de voir le bois pour les arbres. Quelqu'un pourrait-il indiquer une approche que je pourrais adopter? Merci

Répondre

0

Lorsque nous avons implémenté des onglets (JQuery UI) dans l'un de nos sites MVC, nous sommes allés avec les méthodes d'action distinctes pour chaque onglet. Dans notre cas, les onglets étaient suffisamment différents pour que nous ayons des partialViews séparés pour chaque onglet de toute façon.

Même si vous pouvez utiliser le même partialView, je pense que vous aurez beaucoup moins de maux de tête et de maintenance en utilisant des méthodes distinctes pour chaque onglet (pensez à la lisibilité, au traçage des problèmes, améliorations futures). Garder une action, penser à ce que si .... Que se passe-t-il si les entreprises ont besoin de sa propre vision partielle, si les fonds ont besoin de critères de recherche différents, et si nous devons ajouter plus d'onglets? Bien sûr, vous pouvez résoudre tous ces problèmes dans la configuration actuelle, mais à quel moment cela devient-il impossible à maintenir.Être capable de résoudre tout cela et plus sera mieux avec les méthodes d'action distinctes à mon humble avis.

+0

J'ai décidé d'aller avec votre suggestion ... au moins pour l'instant. Si je peux voir un chemin pour le faire de nouveau génériquement, je verrai ce que je peux faire. Mais pour l'instant, je dois progresser et votre suggestion fonctionne. Merci – DaveDev

Questions connexes