Проблема
При работе с мастер-страницами меня обычно раздражает то, что теги сценария в мастер-странице относятся к странице-потребителю.
Так, например, ваш JavaScript может работать, если ваша потребляющая страница находится в корневом каталоге вашего приложения, но когда вы помещаете другую страницу во вложенную папку, относительный путь разрывается и JavaScript не найден. И в этом случае нет способа использовать абсолютные пути, о которых я знаю.
В последний раз я решил по-настоящему атаковать это и найти хорошее решение.
Предлагаемые решения
Я попробовал одну стратегию, которая вращалась вокруг вызова ClientScriptManager.RegisterClientScriptInclude в Page_Load, но, похоже, ничего не отображалось (конечно, мое понимание связанной сантехники неполное).
Я попробовал еще один, который выглядел примерно так:
<script language="javascript" src='<%= ResolveClientUrl("~/js/ddnmenu.js") %>' type="text/javascript"></script>
... Но возникает исключение: коллекцию Controls нельзя изменить, поскольку элемент управления содержит блоки кода.
Рабочий (но несколько неуклюжий) код
Итак, в итоге у меня появился элемент управления Literal в голове, где я визуализирую соответствующий 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
Это работает, но я не в восторге от этого, так как это кажется слишком большим обходным путем для того, что должно быть чрезвычайно распространенной проблемой. Есть ли способ лучше?