2009-03-30 3 views
73

Я пытаюсь добавить ссылку на скрипт для jQuery на моей главной странице, чтобы она работала для любой страницы. В настоящее время она выглядит следующим образомПроблемы с главной страницей и файлом ASP.Net

<script type="text/javascript" src="jquery.js"></script> 

Проблема заключается в том, что путь всегда относителен исполняющая страницу ASPX так что это будет работать, только если файл «jquery.js» находится в той же папке. Для того, чтобы сделать его работу я должен изменить строку:

<script type="text/javascript" src="../../jquery.js"></script> 

Это, очевидно, меньше, чем идеал, потому что он будет работать только для страниц, которые являются два уровня глубины от корневой папки. Если я попробую следующее, IIS выдает ошибку об неожиданном символе.

<script runat="server" type="text/javascript" src="~/jquery.js"></script> 

Любые идеи?

EDIT: Я забыл упомянуть и о том, что сценарий должен быть в голове тега

Текущий верхний ответ бросает «ASP.NET Ajax на стороне клиента базы не удалось загрузить» ошибка когда я добавлю его на мою главную страницу. Его выбросили из javascript, а не в .Net-компилятор. Если я переведу ScriptManager в раздел главы, где он должен быть, я получаю ошибку компиляции в ScriptManager, который должен находиться внутри тега формы.

Третий ответ бросает «недопустимые символы в пути.» Исключение из компилятора

EDIT 2: Когда я добавить эту строку в моей голове теге я получаю эту ошибку из IIS.

Коллекция Controls не может быть изменена, поскольку контроль содержит блоки кода (т.е. <% ...%>)

РЕШИТЬ: Я принял отредактированный ответ от ответа ниже, и поместить его внутри жерех: ContentPlaceHolder элемент

ответ

106

Вы можете использовать ScriptManager:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
    <Scripts> 
     <asp:ScriptReference Path="~/jquery.js" /> 
    </Scripts> 
</asp:ScriptManager> 

EDIT: Если вы абсолютно нужно это в вашем <head> разделе, вы могли бы сделать что-то вроде:

<head> 
    <script type="text/javascript" 
     src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script> 
</head> 

EDIT 2: Согласно комментариям, если вы наблюдаете, что

Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода (т.е. <% ...%>)

вам может понадобиться изменить выше, чтобы использовать синтаксис привязки данных:

<head> 
    <script type="text/javascript" 
     src="<%# Page.ResolveClientUrl("~/jquery.js") %>"></script> 
</head> 
+0

Да, это очень рекомендуемый метод во многих книгах ASP.NET, которые я написал при работе с путями в masterpages. – Kezzer

+0

FYI, мой коллега, и я просто попробовал это. Похоже, что это не работает во вложенном сценарии главной страницы * на родительской главной странице *. Однако переместить его на главную страницу ребенка сделал трюк. – technomalogical

+2

Это работало для меня почти на всех моих страницах, но на 2 страницы, которые взорвались бы с определенным исключением: «Коллекция элементов управления не может быть изменена, потому что элемент управления содержит код». Решение состоит в том, чтобы сменить скрипт в заголовке из кода response.write на блок оценки данных (т. Е. - изменить <% = на <% #). Я бы поставил под угрозу, что это попытка некоторых попыток MS остановить атаки HTTP-заголовков. Лучшее объяснение этого простого исправления можно найти по адресу: http://leedumond.com/blog/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blocks/ – Jagd

0
<script type="text/javascript" src="/full/path/to/jquery.js"></script> 
+2

Проблема с путями выключения корня, что иногда вы можете устр в виртуальный каталог и затем развернуть в корень сайта, или наоборот. – StuartLC

0

Если этот сценарий тег идет непосредственно в браузере, то вы вряд ли может заменить корень вашего сайта есть , По крайней мере, не на сервере. Таким образом, вы можете:

  1. Deploy сайт в корень домена имя и использовать абсолютные пути (простое решение).
  2. Вставьте эту ссылку с серверным управлением.
  3. Предпроцесс, полученный в результате HTML до , отправив его клиенту (с HttpResponse.Filter).
9

Если вы не собираетесь к нам жерех: ScriptManager или абсолютные пути, то вы можете сделать это следующим образом:

<script runat="server" type="text/javascript" 
    src='<%= Page.ResolveUrl("~/jquery.js") %>'></script> 
0

Вы также можете использовать < базу> HTML тег:

<base href="http://www.domain.com"></base> 

, а затем все ссылки в разделе заголовка по сравнению с базовым адресом:

<script type="text/javascript" src="scripts/jquery.js"></script> 

Это часто полезно, когда у вас есть несколько назначений публикации, например, веб-сервер, демонстрационный сервер и т. Д. Вы просто заменяете этот базовый URL.

+0

Как изменить ' base href' программно? –

3

Я не знаю, нашли ли вы решение проблемы или нет. Я столкнулся с одной и той же проблемой и собирался разобраться, почему я получаю ошибку «jQuery is undefined» для подключаемых модулей. Я пробовал все решения, которые я получаю из Интернета, но мне не повезло.

Но вдруг что-то брызнуло мне в голову, что файлы сценариев должны быть в порядке. Итак, я перешел на jquery referece на первую позицию, и все начинает работать, как шарм.

Помните, ребята, если вы используете какие-либо плагины с jquery, убедитесь, что вы используете следующий порядок установки ссылки на эти настройки.

  1. ссылка на библиотеку Jquery
  2. ссылка на другой последующий плагин в библиотеках и так далее ...

например:

  1. "сценарий SRC =" JS/jquery-1.3.2.min.js "type =" text/javascript "...
  2. " script src = "js/jqDnR.min.js" type = "text/javascript" ...
  3. "script src =" js/jquery.jqpopup.min.js "type =" text/javascript "...
  4. " script src = "js/jquery.bgiframe.min.js" type = "text/javascript "...

Всегда убедитесь, что вы должны сначала поставить ссылку на jquery, а затем последующие библиотеки.

Надеюсь, это решает вашу проблему, особенно когда вы используете MasterPages. Очень странно, что он работает независимо от того, какой порядок вы используете, когда не используете MasterPages, но когда вы это делаете, он каким-то образом исправляет правильный порядок.

Удачи и счастливого кодирования,

Vincent D'Souza

3

Посмотрите на How to Run a Root “/”. Это должно устранить все ваши проблемы, связанные с неразрешенными файловыми путями .js. Вы в основном перенастраиваете сервер VS Dev для запуска вашего приложения как localhost:port/, а не обычный localhost:port/application name/, что делает работу с разрешением имени так же, как и в IIS.

0
<body> 
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script> 
</body> 
25

Попробуйте <%# вместо <%= в мастер-странице под головной секции

<script type="text/javascript" 
     src="<%# ResolveUrl("~/YourScriptFolder/YourJQueryOrJavascript.js") %>"> 
</script> 

Затем в код Мастера страницы под Page_Load Event

Page.Header.DataBind(); 

Теперь вы хорошо идти либо jQuery и JavaScript, а также CSS просто вам нужно изменить свой путь в ResolveUrl, какой файл вы хотите обрабатывать CSS, JavaScript, jQue гу.

+1

Нужна строка 'Page.Header.DataBind();' для ее работы для меня, спасибо! –

+0

Вам также может потребоваться добавить атрибут 'runat =" server '' в тег 'head'. – Alex

0

Для абсолютного пути файла для любого использования страниц, то следующее:

<script type="text/javascript" src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script> 
Смежные вопросы