2010-12-01 16 views
0

J'utilise un Html.Grid d'un ensemble d'objets qui sont extraits d'une base de données (via LINQ to SQL). Voici le code de la grille (j'ai changé les données en quelque chose de artificiel). La page est fortement typée à People.Comment faire pour trier une liste de manière générique

<%=Html.Grid<People>(Model)  
// Display chose solution information. 
    .Columns(column => 
     { 
      column.For(person => person.Name); 
      column.For(person => person.Address.City); 
     } 
    ) 
%> 

Dans la base de données, j'aurais une table de personnes et une table d'adresses liées par une clé étrangère. (Encore une fois, cela est artificiel - juste essayer de décrire le problème.)

Je veux permettre à l'utilisateur de trier les colonnes de manière générique. Le développeur précédent avait codé en dur dans le tri dans le contrôleur, comme si ...

// 
// GET: Results/Grid 
public ActionResult Grid(int id, GridSortOptions sort) 
{ 
    if (sort == null) 
    { 
     sort = new GridSortOptions(); 
    } 

    Solution solution = repository.GetSolution(id); 
    List<People> people = solution.People.ToList(); 
    if (!string.IsNullOrEmpty(sort.Column)) 
    { 
     people = solution.People.ToList().OrderBy(sort.Column, sort.Direction).ToList(); 
    } 

    return PartialView("Grid", people); 
} 

Cela fonctionne très bien lorsque l'objet je le tri est des gens (si je clique sur la colonne person.Name pour trier ascendant ou descendant). Cependant, quand je veux trier la colonne d'adresse, j'obtiens une exception parce que les gens ne contiennent pas une ville ... l'adresse fait.

Ma question est ... y a-t-il un moyen de faire ce genre génériquement sans savoir quel type est à l'avance? Merci.

+0

Une partie de votre code n'est pas très claire 'ViewData [" sort "] = sort;' est-ce supposé être inversé? Y a-t-il seulement un niveau d'objets Enfant ou plus d'un? – msarchet

+0

@msarchet - Je hérite de ce code d'un développeur précédent. Je ne crois pas que cette déclaration soit nécessaire. Mise à jour pour refléter cela. Merci. – JasCav

Répondre

0

Que diriez-vous d'un trieur de table javascript? Bien sûr, cela ne fonctionnera pas si votre liste est assez grande pour nécessiter la pagination.

+0

Quel est votre recommandation? Cela peut être une solution possible (bien que, comme vous l'avez dit, la pagination pourrait être un problème). – JasCav

+0

Je suis allé avec quelque chose comme ça: http://tablesorter.com/ – JasCav

0

J'ai posté une question similaire un peu plus tôt. Les réponses que j'ai eu sur ce poste peut vous aider à obtenir sur votre chemin:

Looking for a better way to sort my List<T>

Fondamentalement, les réponses suggèrent la tenue carte de Func <> (ou similaire) et d'appeler celui qui est approprié dans le bloc de code.