2009-06-30 11 views
6

ProblemaWeb Forms: Dinámico (o absolutos) etiquetas script en MasterPages

Cuando se trabaja con MasterPages, una irritación común me encuentro es que las etiquetas script en el maestro son en relación con la página de consumo.

Así, por ejemplo, su JavaScript podría funcionar si su página consumidora está en la raíz de su aplicación, pero cuando coloca otra página en una subcarpeta, la ruta relativa se rompe y no se encuentra el JavaScript. Y no hay una forma de usar rutas absolutas de las que estoy enterado en este caso.

Esta última vez, decidí realmente atacar esto y encontrar una buena solución.

soluciones propuestas

Probé una estrategia que giraba en torno a llamar ClientScriptManager.RegisterClientScriptInclude en Load, pero que no parecen hacer nada (concedido, mi comprensión de la tubería relacionada es incompleta).

he intentado otra que parecía algo como esto:

<script language="javascript" src='<%= ResolveClientUrl("~/js/ddnmenu.js") %>' type="text/javascript"></script> 

... Pero eso se produce una excepción: La colección de controles no puede ser modificado debido a que el control contiene bloques de código.

de trabajo (pero algo fugly) Código

Por lo tanto, lo que terminó yendo con es un control literal en la cabeza donde se renderiza el código HTML correspondiente:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Me.SetupLiteralScriptsTag() 
End Sub 

Private Sub SetupLiteralScriptsTag() 
    'Build the script tags to import our JavaScript 
    Dim Builder As New StringBuilder 

    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/jquery-1.3.2.min.js"))) 
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/jquery.corners.min.js"))) 
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/bg.pos.js"))) 
    Builder.AppendLine(String.Format("<script type=""text/javascript"" src=""{0}""""></script>", ResolveClientUrl("~/js/moonstone.js"))) 

    Me.LiteralScriptTags.Text = Builder.ToString 
End Sub 

Esto funciona, pero No estoy ardiendo al respecto, ya que parece una solución demasiado para lo que debe ser un problema muy común. ¿Hay una mejor manera?

Respuesta

3

Utilizo la sintaxis relativa de la aplicación en todas partes. Tiene el inconveniente de que si cambias el nombre/ruta de la aplicación, entonces tienes mucho trabajo por hacer para actualizar todas tus URL.

< script language = "javascript" src = "/ MyAppName/includes/MyJavascriptFile.js">

o si estuviera trabajando en la aplicación de la raíz, entonces:

< script language = "javascript "src ="/Includes/MyJavascriptFile.js ">

+0

Al menos el trabajo se minimiza en el escenario de las páginas maestras. Es increíble que no supiera que podrías hacerlo de esta manera ... ¡He estado trabajando en aplicaciones web durante mucho tiempo! –

+0

Acepté este en lugar de la respuesta de M4N ya que es el más simple. Puede usarlo sin introducir ningún concepto nuevo en su proyecto ... Aunque sí uso ScriptManager para esto ahora. –

0

Puede hacer referencia a su script siempre desde la raíz. IE:

<script language="javascript" src="/scripts/file.js"></script> 

Cualquier página en su aplicación obtendría el javascript correctamente.

Además, como está trabajando con ASP.NET, puede utilizar el carácter "~" para proporcionar rutas relativas basadas en la aplicación.Ver Rick Strahl's article on ASP.NET paths for more info.

+0

La tilde solo funciona dentro de los controles del servidor. Aunque me encantaría usarlo aquí. –

7

Se podría añadir un scriptmanager a la página principal e incluyen los archivos javascript vía que:

<asp:ScriptManager ...> 
    <Scripts> 
    <asp:ScriptReference Path="~/js/ddnmenu.js" /> 
    </Scripts> 
</asp:ScriptManager> 

Otra ventaja de este enfoque es que, a continuación, puede agregar un control ScriptManagerProxy a sus páginas de contenido (y controles de usuario) para incluir scripts adicionales.

Algunos sustitutos de terceros para ASP: ScriptManager (por ejemplo, de RadControls conjunto telerik 's o desde el Ajax control toolkit) ofrece aún más funciones, tales como la fusión de todos java script archivos incluidos en un archivo (lo que reduce el número de requerido HTTP solicitudes para cargar una página).

Editar: utilizando un ScriptManager tiene algunas otras ventajas, p. puede enviar versiones de depuración o versión de sus scripts al navegador, o scripts dependientes de la cultura, etc. etc. Consulte el this page in MSDN para obtener una descripción general.

+0

Me gusta esta respuesta. Ojalá pudiera aceptarlos a ambos. –

+0

Entonces simplemente acepte el mío ;-) - no en serio, acepte la respuesta que más le haya ayudado. – M4N

1

utilizo Page.resolveUrl("~/somefile.js");

obras como un campeón

0

La colección Controls no puede ser modificado debido a que el control contiene bloques de código

suena familiar ese error. This página me ayudó cuando busqué a tientas este camino