【问题标题】:ResolveClientUrl inside runat server head在 runat 服务器头内的 ResolveClientUrl
【发布时间】:2012-05-01 17:52:47
【问题描述】:

我正在开发一个 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" -->

【问题讨论】:

    标签: asp.net webforms runatserver resolveclienturl


    【解决方案1】:

    您可以使用数据绑定:

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

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

    head.DataBind()
    

    【讨论】:

    • 我知道这是旧的,但旧的东西似乎总是保持相关性。这个答案似乎有效,但在某些情况下也会导致“加载视图状态失败”。
    【解决方案2】:

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

    控件集合。

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 2011-06-03
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多