John Sprunger a rédigé, dans un de ses billets, un ensemble de bonnes pratiques qu’il a amassé au cours de son expérience avec les WebForms.
Avec sa permission, voici la traduction de son billet original :
— Début de la traduction —
Au fil du temps tout en utilisant ASP.NET j’ai collecté un assez bon ensemble de bonnes pratiques que je tente de mettre en place sur mes projets – la plupart d’entre eux sont des choses qui permettront de simplifier l’expérience de développement avec ASP.NET, des solutions aux problèmes communs, ou des astuces qui vous rendront simplement la vie plus facile. La plupart de ces bonnes pratiques ne sont applicables qu’aux WebForms, mais certaines sont applicables à ASP.NET MVC aussi.
- Ne pas écrire du code. NET directement dans votre balisage ASPX (sauf si c’est pour du databinding, c’est à dire des déclarations Eval). Si vous avez également un code-behind, le code de votre page sera dispersé à plusieurs endroits, rendant celui-ci moins gérable. Mettez le code. NET dans votre code-behind. Les choses peuvent très rapidement devenir complexes et difficiles à déboguer quand vous verrez le code s’exécuter à deux endroits différents.
- SessionPageStatePersister peut être utilisé en conjonction avec le ViewState pour rendre celui-ci utile sans augmenter les tailles des pages. Redéfinir le PageStatePersister de la Page avec un nouveau SessionPageStatePersister va permettre de stocker toutes les données du ViewState en mémoire, et ne stocker qu’une clé chiffrée sur côté client. Cela rendra vos pages plus petites et seront téléchargées plus rapidement si vous avez beaucoup de données dans le ViewState pour une raison quelconque, mais il augmentera votre utilisation de la mémoire sur le serveur – donc à utiliser avec précaution. Voir l’exemple ci-dessous pour savoir comment utiliser le SessionPageStatePersister.
public override PageStatePersister GetStatePersister() { return new SessionPageStatePersister(this); }
- Créez une BasePage et faites en hériter vos pages afin de réutiliser le code commun. Simples principes de conception orientée objet – si vous avez des fonctions communes entre les pages, comme la gestion de la sécurité par exemple – les mettre dans une classe de base qui hérite de System.Web.Page, et faites que vos pages héritent de cette page de base.
- Créez une MasterPage pour vos pages pour l’héritage visuel. N’utilisez pas de server-sides includes ASP. Les pages avec des styles visuels très différents devraient utiliser une MasterPage différente. N’utilisez pas une MasterPage pour de l’héritage de code.
- Utilisez le cache fournit par ASP.NET afin de mettre en cache les informations fréquemment utilisée de votre base de données. Développez (ou réutilisez) une couche de cache générique qui encapsulera le cache ASP.NET. Si vous récupérez la même liste de la base dans une liste déroulante à chaque fois qu’une page se charge, vous devriez récupérer cette liste à partir du cache et le paramétrer en fonction de votre besoin.
- Encapsulez les objets enregistrés dans le ViewState avec des propriétés sur vos pages afin d’éviter les erreurs d’orthographe lors du développement, etc. lorsque vous référencez des éléments de la collection ViewState. Par exemple, vous ne devriez avoir ViewState[ "key"] qu’une seule fois dans votre page par propriété. Voir l’exemple ci-dessous.
private int SampleId { get { return ViewState["SampleId"] == null ? 0 : (int)ViewState["SampleId"]; } set { ViewState["SampleId"] = value; } }
- Évitez de mettre de gros objets et graphes d’objets dans le ViewState, utilisez le principalement pour stocker des identifiants ou des objets DTO très simple. C’est la raison pour laquelle les gens se plaignent toujours d’un ViewState énorme – ils stockent des choses comme des DataSets dans le ViewState (mauvaise idée). Si vous vous cantonnez a de petits objets avec un nombre limité de propriétés ou tout simplement des identifiants sous forme d’entiers, les données de votre ViewState ne seront pas ingérable et dans ce cas, le ViewState est tout à fait utilisable.
- Encapsulez l’objet Session ASP.NET avec une classe SessionManager afin d’éviter les erreurs d’orthographe lors du développement, etc. lorsque vous référencez des éléments de la collection Session. Juste une autre façon de limiter les erreurs simple de développement.
- Utilisez abondamment les valeurs de configuration avec les applicationSettings key/value dans le web.config – encapsulez la classe Configuration.ApplicationSettings avec une classe qui peut être utilisée pour récupérer facilement des paramètres de configuration fortement typés sans avoir à mémoriser les clés dans le web.config. Si vous avez des paramètres, comportements, etc. qui ont besoin de changer entre les différents déploiements de votre application, ceux-ci devraient être contrôlés via des paramètres dans le web.config. Par exemple, on nous demande souvent « Nous voulons que la fonctionnalité X soit active à la fin du mois » – donc développez, testez et déployez la mise à jour à l’avance. Mais, ajoutez une valeur dans le web.config qui contrôle si oui ou non la fonction doit s’afficher c’est-à-dire FeatureXEnabled= »False », et le jour J allez le changer à « True ».
- Evitez la facilité en définissant les propriétés d’affichage sur vos contrôles d’interface utilisateur, au lieu de ça utilisez les styles CSS et des classes – ce qui rendra vos styles plus gérable. Juste une bonne pratique de développement web en général.
- Créez des UserControls au sein de votre application afin de réutiliser les fonctionnalités communes liées à l’interface utilisateur au travers de vos pages. Par exemple, si une liste déroulante contenant une collection de catégories sera utilisée à plusieurs endroits dans le site – créez un contrôle CategoryPicker qui se liera lui-même aux données quand la page sera chargée. Il s’agit de la bonne pratique #1 qui me fait gagner le plus de temps, et pourtant je suis toujours surpris de voir combien souvent je vois la même liste déroulante avec les mêmes données utilisée de la même façon sur 20 pages différentes – et aussi la même logique de liaison de données non typée en double 20 fois!
- Utilisez des Propriétés sur vos UserControls pour configurer des choses comme les valeurs par défaut, un affichage différent entre les pages, etc. Les propriétés de type valeur peuvent être définies dans votre UserControl et ensuite être spécifié dans votre balisage ASP.NET en utilisant les propriétés définies au niveau de la classe sur les UserControls. Il s’agit d’une excellente façon d’augmenter le découplage en dehors de réutiliser vos UserControls – attention cependant à la complexité de la logique de votre UserControl qui augmente.
- Utilisez les contrôles de validation ASP.NET pour effectuer les validations simples, et utilisez le CustomValidator pour effectuer des validations complexes.
- Créez une page qui gère les erreurs d’une façon conviviale pour l’utilisateur sur laquelle on peut être redirigé quand une quand une exception non gérée se produit au sein de votre site Web. Loguez toutes les exceptions qui arrivent sur cette page. La redirection peut être effectuée via l’événement Page_Error dans votre page de base, l’événement Application_Error dans votre Global.asax, ou dans la section liée au traitement des erreurs dans le web.config. Fondamentalement, selon la méthode que vous adopterez – assurez-vous de ne pas laisser disparaître toute exception non gérée ou non loguée!
- Lorsque vous travaillez avec des pages qui utilisent des affichages dirigés par des données hautement dynamiques, utilisez le composant (gratuit) DynamicControlsPlaceholder créé par Denis Bauer afin de simplifier le code nécessaire pour sauvegarder l’état de contrôles ajoutés dynamiquement entre les postbacks. Ce petit contrôle m’a permis de sauver d’innombrables heures de souffrance dans la création de pages avec des UserControls très dynamiques. Un truc – si vous utilisez la gestion des événements délégués dans un UserControl, vous devez les rebrancher à PostBack, c’est un peu sale mais ce n’est pas un gros problème le plus souvent. Les gestionnaires d’événements sont le seul «État» qui n’est pas enregistré entre les PostBacks si vous utilisez ce contrôle.
- Désactivez le ViewState des contrôles et UserControls qui n’en ont pas besoin.
— Fin de la traduction —
En espérant que ces bonnes pratiques vous aide !
PS : si la traduction est incorrecte à certains endroits, n’hésitez pas à me le signaler, je ne suis qu’un développeur =)




