2010-03-12 14 views
5

Tengo una vista parcial (UserControl) que implementa un buscapersonas simple en mi proyecto Asp.Net MVC. Este buscapersonas necesita acceso a un archivo .js que se debe incluir exactamente una vez, independientemente de cuántas instancias del control de buscapersonas estén presentes en la página principal.¿Cómo puedo incluir un archivo JavaScript externo exactamente una vez por vista parcial?

He intentado usar Page.ClientScript.RegisterClientScriptInclude, pero no tuvo ningún efecto (supongo que porque el nugget de código se evaluó demasiado tarde para afectar el control de la cabeza). ¿Hay alguna alternativa simple?

Respuesta

2

Establezca un indicador en HttpContext.Current.Items cuando envíe el script en su parcial; es un diccionario que permanece para toda la solicitud. P. ej .:

if (!HttpContext.Current.Items.Contains("SentTheScript")) 
{ 
    HttpContext.Current.Items["SentTheScript"] = true; 
    Response.Write(Html.ScriptTag("Script")); 
} 

De esta manera se representará como máximo una vez.

+0

Esto debería funcionar, pero no permite mucho control sobre dónde terminan las etiquetas de script. No es posible agruparlos en la cabeza, o agrupados en la parte inferior del cuerpo, por ejemplo. – AaronSieb

+0

Esto responde la pregunta tal como está escrita, por lo que se acepta. – AaronSieb

1

Page.ClientScript.RegisterClientScriptInclude se utiliza con el ASP.net tradicional.

Dado que utiliza asp.net-mvc, todo lo que necesita es agregar la directiva script del archivo js a la página que utiliza este control de usuario.

Dado que es una buena práctica tener solo un archivo css minificado en todo el sitio, probablemente desee incluir este archivo en el archivo principal css minified.

+1

Gracias, pero este control está destinado a ser utilizado en varias páginas, y probablemente tendrá más de una vez que haya terminado. Prefiero no tener que recordar qué incluye lo que necesito para cada control que creo, si es posible. Aunque, supongo que podría agregarlos a una página maestra, si no hay otra alternativa ... – AaronSieb

+0

Dado que usa parte del sitio, puede usarlo en todo el sitio y almacenarlo en caché en el equipo cliente. –

2

Agréguelo a la página maestra.

Entonces puede garantizar que solo se incluirá una vez, y no lo olvidará. Con el almacenamiento en caché moderno, realmente no hay pérdida de rendimiento al incluirlo en cada página.

+1

No estoy seguro de que me gusta este enfoque, ya que siempre está ahí aunque el control no esté cargado. Eso sí, en realidad no tengo una mejor solución. – griegs

+0

No hubiera pensado que realmente era un problema, pero estoy feliz de que me corrijan. –

+0

Parece que esta es la ruta a seguir para cualquier dependencia compartida. Sin embargo, todavía no estoy seguro de si quiero todos los JS específicos del control en el maestro. – AaronSieb

Cuestiones relacionadas