2010-03-11 18 views
5

Woo, tengo un gran problema (incluso podría ser uno para el Daily WTF) y espero que haya una solución. (Mis disculpas por la larga publicación ...)Alternativa a Page_Load en ASP.NET (y una buena historia WTF)

He estado trabajando en un sitio web que heredé hace aproximadamente un mes. Una de las partes en las que he estado trabajando es arreglar uno de los controles (esencialmente una barra de encabezado dinámico) para que muestre información adicional según lo solicitado por mis usuarios. Como parte de este proyecto, creé un archivo Site.master para no tener que volver a codificar la barra de encabezado en cada página. Cuando comencé a hacer esto, aparentemente funcionó muy bien. Todas las páginas que había desarrollado se veían geniales y la barra se actualizó, ya que debería mostrar la información como debería.

Bueno, cuando dejé el Site.master (y este control) en páginas de sitios más antiguas (que no desarrollé específicamente) noté que se veía mal en algunos de ellos, pero no en todos. Cuando digo que se veía mal, básicamente, el control se alinearía a la izquierda con la página en lugar de centrarse como debería. Pasé un par de horas depurando inútilmente - CSS parecía correcto, el HTML parecía estar bien, no vi nada en el Javascript (aunque, me perdí algo como lo señalaré en un segundo), e incluso el código anterior parecía correcto (lo mejor que podía, no está muy bien escrito). Otro compañero de trabajo echó un vistazo al sitio y tampoco pudo encontrar nada al principio.

No fue hasta que pensé en mirar el código fuente de la página procesada (había estado trabajando en la vista de desarrollador hasta este punto en IE8) que quedó claro lo que estaba mal.

El desarrollador original realiza búsquedas en muchas de las páginas. Para lograr esto, consulta la base de datos para TODOS los datos y luego los carga en matrices de Javascript dentro de la página para que pueda acceder a ellos. Esto en sí mismo es un gran problema porque estamos hablando de miles de elementos, y obviamente no es escalable (y, sí, el sitio es lento). Sin embargo, finalmente hizo clic en lo que estaba arruinando Site.master: cuando carga los datos en los arreglos de Javascript, escribe los datos en el HTML sobre Page_Load usando numerosas llamadas Response.Write (cadena). El WTF (y lo que me estaba molestando) es que él inserta el Javascript antes de que el DOCTYPE haga que el IE entre en el modo peculiar!

Así que, al menos necesito sacar este lanzamiento (solucionaré el problema real más adelante), me preguntaba: ¿hay alguna manera de forzar que este Javascript se inserte en otro lugar en el HTML — después del ¿DOCTYPE por lo menos? En este momento, todas las llamadas a Response.Write() se están realizando en el método Page_Load. Solo necesito que se inserten más tarde.

Respuesta

5

Hay varias formas de hacerlo, lo más probable es que la forma "correcta" de hacerlo sea construir la cadena, luego use el método Page.ClientScript.RegisterClientScriptBlock para registrar el JS, esto lo colocará en el lado derecho lugar

Otra alternativa, que es más de la manera rápida y sucia sería agregar un control a la página, y en lugar de response.write, construir el JS, luego establecer la propiedad de texto del control literal.

+0

+1 - publicamos * el mismo segundo *, pero su respuesta es mejor :) –

+0

Gracias, en realidad también lo reformulé, ya que técnicamente, Page.ClientScript es la "mejor" y correcta forma de hacerlo ... –

0

Ponga el código JavaScript generado en una propiedad en la página maestra, y la página maestra lo maneja. La página maestra muestra después de las páginas que encapsula, pero sus miembros están disponibles para sus páginas de contenido.

1

La forma más fácil de reemplazar las llamadas Response.Write probablemente sería utilizar un StringBuilder:

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

y utilice la página.ClientScript manager para colocar el script donde podría ser utilizado. Existen varios métodos para registrar el guión, y cada uno pone el guión en diferentes ubicaciones en la página, dependiendo del ciclo de vida del control actual se encuentra en He aquí un ejemplo (ya cubiertos arriba):.

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