我正在开设一个网站表单。 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" -->
答案 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;控制集合。