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 : 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; }
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
 
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 : 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);
}
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 : 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.