2010-03-11 7 views
5

Woo, j'ai un doozy d'un problème (pourrait même être un pour le Daily WTF) et j'espère qu'il y a une solution. (Mes excuses pour le long post ...)Alternative à Page_Load dans ASP.NET (et une bonne histoire WTF)

J'ai travaillé sur un site Web dont j'ai hérité il y a environ un mois. L'une des parties sur lesquelles j'ai travaillé consiste à corriger l'un des contrôles (essentiellement une barre d'en-tête dynamique) afin qu'il affiche des informations supplémentaires à la demande de mes utilisateurs. Dans le cadre de ce projet, j'ai créé un fichier Site.master afin que je n'aie pas à recoder la barre d'en-tête dans chaque page. Quand j'ai commencé à faire ça, ça a très bien fonctionné. Toutes les pages que j'avais développées avaient l'air bien et la barre a mis à jour car elle devrait afficher les informations comme il se doit. Eh bien, quand j'ai laissé tomber Site.master (et ce contrôle) dans des pages de site plus anciennes (celles que je n'ai pas développées spécifiquement), j'ai remarqué que cela semblait mauvais sur certains d'entre eux, mais pas tous. Quand je dis que ça a l'air mauvais, fondamentalement, le contrôle s'alignerait sur la page plutôt que sur le centre comme il se doit. J'ai passé quelques heures à déboguer en vain - CSS semblait correct, le HTML semblait correct, je n'ai rien vu dans le Javascript (bien que, j'ai manqué quelque chose comme je le ferai remarquer dans une seconde), et même l'ancien code avait l'air correct (du mieux qu'il pouvait - ce n'est pas très bien écrit). Un autre collègue a regardé le site et n'a rien trouvé au début non plus.

Ce n'est que lorsque j'ai pensé à regarder le code source rendu de la page (je travaillais dans la vue du développeur jusqu'à présent dans IE8) que j'ai compris ce qui n'allait pas.

Le développeur d'origine effectue des recherches sur plusieurs pages. Pour ce faire, il interroge la base de données pour TOUTES les données et les charge ensuite dans des tableaux Javascript dans la page afin qu'il puisse y accéder. C'est en soi un énorme problème car nous parlons de milliers d'éléments, et il est évident que ce n'est pas évolutif (et, oui, le site est lent). Cependant, il a finalement cliqué sur ce qui déformait le Site.master - quand il charge les données dans les tableaux Javascript, il écrit les données au HTML sur Page_Load en utilisant de nombreux appels Response.Write (string). Le WTF (et ce qui me dérangeait) est qu'il insère le Javascript avant le DOCTYPE obligeant IE à passer en mode bizarreries! Donc, parce que j'ai besoin d'au moins sortir cette version (je vais résoudre le vrai problème plus tard), je me demandais: est-il possible de forcer ce Javascript à être inséré ailleurs dans le code HTML — après le DOCTYPE à tout le moins? À l'heure actuelle, tous les appels Response.Write() sont en cours dans la méthode Page_Load. J'ai juste besoin qu'ils soient insérés plus tard.

Répondre

5

Il y a un certain nombre de façons de le faire, plus que probablement la "bonne" façon de le faire serait de construire la chaîne, puis utilisez la méthode Page.ClientScript.RegisterClientScriptBlock pour enregistrer le JS, cela le mettra dans le bon Une autre alternative, plus rapide et plus sale, consisterait à ajouter un contrôle à la page, et plutôt que response.write, construire le JS, puis définir la propriété text du contrôle littéral.

+0

+1 - nous avons posté * la même seconde *, mais votre réponse est meilleure :) –

+0

Merci, je l'ai en fait reformulé, car techniquement Page.ClientScript est le "meilleur" et le bon moyen de le faire ... –

0

Placez le code JavaScript généré dans une propriété de la page maître et la page maître le gérera. La page maître affiche après les pages qu'elle encapsule, mais ses membres sont disponibles pour ses pages de contenu.

1

La meilleure façon de remplacer les appels Response.Write serait probablement d'utiliser un StringBuilder:

StringBuilder sb = new StringBuilder(); 
sb.Append("your script writes here"); // instead of Response.Write 

et utilisez la page.Gestionnaire de ClientScript pour placer le script là où il pourrait être utilisé. Il existe plusieurs méthodes pour enregistrer le script, et chacun place le script dans différents endroits sur la page, en fonction du cycle de vie du contrôle actuel, vous êtes ici est un exemple (déjà couvert ci-dessus):.

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "yourScriptKey", sb.ToString());