2010-08-13 5 views
3

J'ai besoin de créer un menu d'actions générales pour mes pages. Toutes les pages implémenteront certaines fonctionnalités basiques, par exemple en ajoutant de nouvelles lignes à une table, en les éditant, en appelant des filtres. Beaucoup de ces pages n'auront besoin que d'une logique basique pour exécuter cette fonctionnalité. Mais certaines pages implémenteront leur propre logique pour les options du menu.Est-il possible de créer un gestionnaire d'événements de base pour plusieurs pages avec contrôle utilisateur ou page maître?

Je veux que cela se produise en utilisant des événements dans le menu. Donc, je n'aurai pas besoin des seuls événements, mais un gestionnaire d'événement de base pour toutes les pages. Et ce gestionnaire devrait être construit d'une manière qui pourrait être annulée. Le problème est que je ne sais pas comment créer un gestionnaire pour toutes les utilisations futures du menu. Cela semble un peu utopique d'une certaine manière. Est-ce réel de créer une architecture comme celle-ci?

J'ai réfléchi à deux façons de procéder: page principale ou contrôle utilisateur. Mais je ne sais pas vraiment si c'est même possible. Alors qu'est-ce que tu en penses?

UPD: Remis à la fois les deux réponses sur les pages de base: vous savez sûrement de quoi vous parlez. Merci. Désolé que la bonne réponse ne peut être sélectionnée qu'une seule fois.

+0

upvoted parce que C'est une question que beaucoup de programmeurs posent. –

Répondre

1

Vous ne devriez vraiment pas instancier des objets sur des pages inutilement, comme cette approche le ferait certainement. En gardant cela à l'esprit, vous pouvez créer une page de base dont les pages pertinentes héritent, vous avez donc accès aux méthodes dont vous avez besoin.

  1. Créez une classe de type System.Web.UI.Page. (Nommez-le MyBasePageClass)
  2. Implémentez les méthodes communes nécessaires dans cette classe
  3. Héritez cette classe sur les pages dont vous avez besoin pour exposer les méthodes. Par exemple, changer votre définition de la classe page Default.aspx à ceci: public partial class Par défaut: MyBasePageClass

Les méthodes créées dans MyBasePageClass doivent être publics pour être vu par Default.aspx.cs.

+0

Oui - la création d'une classe de base est une façon de procéder comme expliqué ci-dessus mais avec deux corrections: les premières méthodes de gestionnaire d'événement n'ont pas besoin d'être publiques, elles peuvent être protégées. Deuxièmement, vous voulez les rendre virtuels afin que certaines pages puissent remplacer le comportement de gestion des événements par défaut et fournir les siennes. – VinayC

+0

oui, désolé, protégé parce que vous héritez de la classe. – TheGeekYouNeed

0

Je pense que «créer gestionnaire pour toutes les utilisations futures» semble effrayant. Ce que je ferais était de créer les pages individuellement, et seulement quand j'identifie une certaine logique qui est égale ou semblable je refactoriserais ceci dehors à une classe séparée que plusieurs formes pourraient employer.

Après tout, le code doit être utilisé avant de pouvoir être réutilisé.

+0

C'est vrai, bien sûr, mais je ne fais que reconstruire le projet Winforms, écrit en Delphi, sur Asp.Net. Et dans l'ancienne version, il y a cette architecture, mais bien sûr je ne peux pas simplement copier des algorithmes Delphi écrits avec les fonctionnalités spéciales et les hacks de Deplhi, d'autant plus pour le web. –

+0

Je crois que vous aurez du mal à déplacer un projet de WinForms vers WebForms si vous essayez de recréer le même flux d'applications et la même logique. La sémantique des deux technologies est trop différente. –

1

Dans beaucoup de mes applications, j'utilise une classe de base commune si j'ai des fonctionnalités à partager sur plusieurs pages. Ce n'est pas une pratique rare, vraiment.

La mise en œuvre pourrait ressembler à ceci:

public class MyApplicationPage : System.Web.UI.Page 
{ 
    public virtual void RaiseMyCustomEvent(EventArgs e) 
    { 
    } 
} 

Le mot-clé virtual rend la méthode Overridable.

Dans mon code individuel behinds, l'héritage de la page pourrait ressembler à ceci:

public partial class MyPage : MyApplicationPage 
{ 
    public override void RaiseMyCustomEvent(EventArgs e) 
    { 
     // ... 
    } 
} 

Enfin, dans ma page principale, je pourrais trouver le code comme ceci dans une méthode:

if (Page is MyApplicationPage) 
{ 
    ((MyApplicationPage)Page).RaiseMyCustomEvent(EventArgs.Empty); 
}