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?
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! –
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. –