Gestion de plusieurs tables sur la même page (paging / sorting / search)
Bonjour,
il y a quelque temps, j'ai poser quelques question sur un moyen d'écrire une table générique permettant la pagination / recherche / tri. Celle-ci fonctionne correctement lorsqu'elle est unique sur la page mais pas dans la cas ou il y en aurait plusieurs.
Le tout sans utiliser javascript par défault... Celui-ci n'étant absolument pas un standard web.
Je m'explique :
J'ai un objet de type Table<T> where T : IPersonalObject, qui contient tout les objets devant être listés.
Cet object a plusieurs properties :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
- La liste complète d'objets
public IEnumerable<T> Items { get; set; }
- La liste à afficher
public IEnumerable<T> ShowedItems { get; set; }
- Le nom action permettant la pagination
public string ListAction { get; set; }
- Le nom du controller ou se trouve cette action
public string ListController { get; set; }
- Le type de requete (get / post)
public string ListMethod { get; set; }
- Le numéro de la première page (1)
public int FirstPage { get; set; }
- Le numéro de la page précédente
public int PreviousPage { get; set; }
- La page actuelle
public int CurrentPage { get; set; }
- Le numero de la page suivante
public int NextPage { get; set; }
- Le numéro de la dernière page
public int LastPage { get; set; }
- Le nombre d'éléments par page
public int CapacityPerPage { get; set; }
- Un énum ayant : 0 = ASC, 1 = DESC
public SortOrder SortOrder { get; set; }
- La property sur laquelle faire le sort
public PropertyInfo SortProperty { get; set; }
- La recherche effectuée sur la table
public string Search { get; set; } |
J'ai également écrit une méthode d'extension qui est la suivante :
Code:
1 2 3 4 5 6
|
public static Table<T> ToTable<T>
(this IEnumerable<T> items, int capacityPerPage,
int currentPage, string search = null,
bool showAll = false, string action = null,
string controller = null, string method = "get") where T : IPersonalObject |
Un exemple de contrôleur avec une simple liste :
Code:
1 2 3 4 5 6 7
|
public ActionResult Index(string search = null, string sort = null, int order = 1, int take = 10, int page = 1)
{
IList<Person> people = PersonManager.Search(search).ToList();
IdToSession(people.Cast<IPersonalObject>().ToList(), "Person");
return View("Index", people);
} |
Il est possible d'utiliser la méthode d'extension afin de produire une table<T> soit dans la vue soit dans le contrôleur.
Le problème est lorsqu'il faut gérer la pagination sur plusieurs tables se trouvant sur une même page (exemple : les détails d'une personne contiennent :
- Une liste de site,
- Une liste de services,
- Une liste de contacts,
- Une liste de groupes
...
Il est nécéssaire de passer dans une action d'un contrôleur à chaque affichage (même au premier) puisque c'est à cet endroit la qu'il sera possible d'insérer les identifiants des différents objets de la table en session afin de rendre ces objets exportables sous différents formats.
J'ai également pensé à utiliser une objet "context-like" contenant les différentes informations sur les tables :
Voici le code de celui-ci :
Code:
1 2 3 4 5 6 7
|
public IDictionary<string, int> Pages { get; set; }
public IDictionary<string, string> Searches { get; set; }
public IDictionary<string, string> Sorts { get; set; }
public IDictionary<string, int> Capacities { get; set; }
public IDictionary<string, IDictionary<string, int>> ColumnsWidth { get; set; }
public IDictionary<string, bool> InitializedTables { get; set; } |
Malheureusement, Cela ne change rien. A moins de pouvoir mettre les ids des différents objets à partir de la vue...
PS : Je rappel que le JavaScript ne doit pas être utilisé pour tout cela. Il sera ajouté par la suite en dessus de tout ca.
Quelqu'un aurait-il une idée pour gérer plusieurs tables alors ?
Merci de votre aide.