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 :
J'ai également écrit une méthode d'extension qui est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Un exemple de contrôleur avec une simple liste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager