ResatClientUrl在runat服务器头内

时间:2012-05-01 17:52:48

标签: asp.net webforms runatserver resolveclienturl

我正在开设一个网站表单。 head标签有runat服务器attr。在母版页中。

我正在尝试将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" />). 

那么,如何在runat服务器头内使用ResolveClientUrl?

更新:

我在主页顶部使用include添加了脚本(似乎工作正常)..但可能有更好的解决方案。

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

2 个答案:

答案 0 :(得分:2)

您可以使用数据绑定:

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

然后在你的代码隐藏中(最好是在Page Load事件处理程序中):

head.DataBind()

答案 1 :(得分:0)

您收到该消息的原因是,在引入代码块时,必须锁定包含runat =“server”控件的ControlCollection,以防止在呈现时核心框架无法从中恢复的意外情况(并因此执行渲染代码块)

使用任何想要“添加”自己的代码到服务器控件集合时会让事情复杂化。

为了防止这种情况,最好的方法是将任何代码块包装在头部的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的控件集合而不是&lt; head runat =“server”&gt;控制集合。