ProblèmeWebForms: dynamique (ou absolue) des balises script dans MasterPages
Lorsque vous travaillez avec MasterPages, une irritation commune je rencontre est que les balises de script dans le maître sont liés à la page consommatrice. Par exemple, votre JavaScript peut fonctionner si votre page consommatrice est à la racine de votre application, mais lorsque vous placez une autre page dans un sous-dossier, le chemin relatif est interrompu et le JavaScript n'est pas trouvé. Et il n'y a pas moyen d'utiliser des chemins absolus dont je suis conscient dans ce cas.
Cette dernière fois, j'ai décidé de vraiment attaquer cela et de trouver une bonne solution.
Solutions proposées
j'ai essayé une stratégie qui tournait autour de l'appel ClientScriptManager.RegisterClientScriptInclude à Page_Load, mais cela ne semble pas rendre quelque chose (accordé, ma compréhension de la plomberie connexe est incomplète).
J'ai essayé une autre qui ressemblait à ceci:
<script language="javascript" src='<%= ResolveClientUrl("~/js/ddnmenu.js") %>' type="text/javascript"></script>
... Mais ce déclenche une exception: la collection Controls ne peut pas être modifié car le contrôle contient des blocs de code.
de travail (mais un peu fugly) Code
Alors, ce que je fini par aller avec est un contrôle Literal dans la tête où je rends le approprié Html:
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
Cela fonctionne, mais Je ne suis pas en feu à ce sujet, car il semble que ce soit un peu trop d'une solution de contournement pour ce qui doit être un problème extrêmement commun. Y a-t-il un meilleur moyen?
Au moins le travail est minimisé dans le scénario des pages maîtres. C'est incroyable que je ne savais pas que vous pouviez le faire de cette façon ... Je travaille sur des applications web depuis très longtemps! –
J'ai accepté celui-ci au lieu de la réponse de M4N puisque c'est le plus simple. Vous pouvez l'utiliser sans introduire de nouveaux concepts dans votre projet ... Bien que j'utilise ScriptManager pour ça maintenant. –