1

我正在开发一个 Web 表单站点。头标签具有 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" />). 

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

更新:

我已经使用母版页顶部的包含添加了脚本(似乎工作正常)..但可能有更好的解决方案。

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

2 回答 2

3

您可以使用数据绑定:

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

然后在您的代码隐藏中(最好在页面加载事件处理程序中):

head.DataBind()
于 2012-05-02T18:32:54.923 回答
1

您收到该消息的原因是,当引入代码块时,必须锁定包含 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 的控件集合,而不是 <head runat="server"> 控件集合。

于 2013-10-31T15:42:15.430 回答