Question

J'ai un contrôle de menu (dérivé), qui affiche une assez grande liste d'éléments à partir d'une source de données personnalisée. Je dois désactiver ViewState dans le menu pour éviter le très agaçant " Impossible de sélectionner un élément de menu désactivé ou non sélectionnable " lorsqu'un autre contrôle provoque la modification de la sélection en cours sur une publication.

Malheureusement, lorsque ViewState est désactivé pour le menu, les publications générées par le menu ne déclenchent aucun événement. Si j'active ViewState, l'événement OnMenuItemClick est déclenché. Si je désactive ViewState, OnMenuItemClick n'est pas déclenché. Je suis perplexe.

Je dois laisser ViewState désactivé pour le menu. Comment puis-je gérer les publications à partir du menu actuel?

À ce stade, je suis plutôt enclin à utiliser l'événement Load du menu, à analyser le __EVENTTARGET pour voir si c'est le menu et à partir de là. Cela traiterait techniquement l’événement de publication avant de le faire normalement, mais c’est correct, je suppose.

De meilleures idées?

Était-ce utile?

La solution 2

J'ai compris l'essence du problème. En utilisant Reflector, nous pouvons voir la (les) partie (s) importante (s) de la méthode de bas niveau qui gère la publication réelle, puis déclenche l'événement:

string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
    this.OnMenuItemClick(new MenuEventArgs(item));

Comme vous pouvez le voir, MenuEventArgs reçoit un MenuItem. S'il n'en trouve pas dans la collection d'éléments en cours qui correspond aux données de publication entrantes, l'événement n'est pas déclenché. Lorsque ViewState est désactivé, le menu ne contient aucun élément (ils auraient été reconstruits à l'aide de ViewState). Donc, l'événement ne sera pas déclenché.

Pour contourner ce problème, j'ai demandé au menu de se construire pendant le chargement en utilisant les données non encore mises à jour (à ce stade, ce sera la même chose qu'à la fin de la dernière demande). Cela revient essentiellement à reconstruire le menu à partir de ViewState, donc je ne me sens pas mal en ce qui concerne les performances, ou peu importe. OnMenuItemClick est ensuite déclenché comme prévu. Enfin, lors de la pré-restitution, je demande au menu de reconstruire une nouvelle fois, afin que les modifications apportées au cours du cycle de vie du traitement de postback soient prises en compte.

J'ai perdu beaucoup de temps à ce sujet. J'espère que cette information pourra aider quelqu'un d'autre dans une situation similaire.

Autres conseils

Oui, vous pouvez choisir d'utiliser viewstate pour repeupler un contrôle lié ou vous pouvez l'indexer avant que les événements ne soient déclenchés (Page_Load is fine).

Je ne le lierais pas nécessairement nécessairement à nouveau dans Page_PreRender, cependant, si rien n'a changé dans cette publication (des modifications sont survenues ailleurs sur la page), il n'y a aucune raison de le lier à nouveau.

Au lieu de cela, vous ne pourrez peut-être vous lier que pour certains événements lorsque vous savez que cela devra changer.

Dans Page_Load, rapprochez le contrôle à la sitemapdata et vérifiez si IsPostBack.

if (IsPostBack) {
            Menu.DataBind();
}

cela fonctionne pour moi et réduit le viewstate.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top