ResolveClientUrl внутри головы сервера runat

Я работаю над сайтом веб-формы. Тег head имеет атрибут сервера runat. на главной странице.

Я пытаюсь использовать ResolveClientUrl для файла .js следующим образом:

 <head runat="server">
   .. 
  <script src='<%= ResolveClientUrl("~/myscript.js") %>' type="text/javascript" >    </script>
 </head>

Но затем я получил ошибку:

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>). 

Я узнал, что проблема была в сервере runat, поэтому я удалил его из тега head... и теперь я получаю следующую ошибку:

Using themed css files requires a header control on the page. (e.g. <head runat="server" />). 

Итак, как я могу использовать ResolveClientUrl внутри сервера runat?

ОБНОВЛЕНИЕ:

Я добавил сценарий, используя включение в верхней части главной страницы (кажется, работает нормально).. но может быть лучшее решение.

<!-- #include file="myscript.js" -->

person Osvier    schedule 01.05.2012    source источник


Ответы (2)


Вы можете использовать привязку данных:

<head ID="head" runat="server">
    ..
    <script src='<%# ResolveClientUrl("~/myscript.js") %>' type="text/javascript" >    </script>
</head>

Затем в вашем коде программной части (желательно в обработчике событий загрузки страницы):

head.DataBind()
person Keith    schedule 02.05.2012
comment
Я знаю, что это старо, но старые вещи всегда остаются актуальными. Этот ответ, кажется, работает, но также приводит к тому, что в некоторых обстоятельствах не удается загрузить состояние просмотра. - person end-user; 03.12.2019

Причина, по которой вы получаете это сообщение, заключается в том, что когда вводятся блоки кода, ControlCollection для содержащего элемента управления runat="server" должен быть заблокирован, чтобы предотвратить непредвиденное состояние, из которого базовая структура не сможет восстановиться при рендеринге (и, следовательно, выполнение блоков кода рендеринга)

И все усложняется при использовании любого кода, который хочет «добавить себя» в коллекцию серверных элементов управления.

Чтобы предотвратить это, лучше всего обернуть любые блоки кода в элемент управления Literal в голове:

<head runat="server">
   <title></title>
   <asp:Literal runat="server" id="SCRIPTLIT1">
    <script src='<%# ResolveClientUrl("~/myscript.js") %>' type="text/javascript"></script>
   </asp:Literal>

<!-- ...other stuff -->
   <asp:ContentPlaceholder runat="server" id="head"></asp:ContentPlaceholder>
</head>

Итак, теперь мы заставили фреймворк заблокировать коллекцию элементов управления Literal, а не коллекцию элементов управления ‹head runat="server"›.

person enorl76    schedule 31.10.2013