最近遇到一个奇怪的问题,一段在 head 中的代码,有些大多数人的机器上运行没有问题,我在服务器上执行也没有问题,而在一部分人执行起来就直接报错:
控件包含代码块(即 <% ... %>),因此无法修改控件集合。
出问题的两个系统一个是 2003 企业版,一个是 2008 企业版,都是安装在个人电脑上,但服务器使用的也是 2008 企业版,却没有出问题,SP补丁版本,.Net Framework版本也都相同,确实很奇怪,莫非是 Z 版支持较好?
出问题的代码:
<head runat=”server”>
<link href="<%= ResolveUrl("~/Style/main.css") %>" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="<%= ResolveUrl("~/JavaScript/jquery.js") %>"></script>
</head>
<link href="<%= ResolveUrl("~/Style/main.css") %>" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="<%= ResolveUrl("~/JavaScript/jquery.js") %>"></script>
</head>
查找了一些资料,认为应该是一个 .Net 框架限制的问题,因为 aspx 页面的 head 必须加 runat=”server” 属性,那么其下的所有标签也应该被处理成了控件树的一部分,下层数据的动态改变导致上层容器就变得无法修改集合,当然,这也是基于一种猜测,但是我找到的最有可能的一种猜测。
不管 .Net 内部搞什么灰机,我要解决当下的问题,总的说来有两种解决之道:
1、网络上盛传的方法,将 head 中所有涉及 <% ... %> 的元素都移到 body 中去,但显然这是一种不得已而为之的办法,引用式样和脚本本身就应该处于 head 中才对,不推崇。
2、我的方法:增加一个 HeadQuote.ascx 用户控件,然后将这个控件引用到 head 中
<head runat="server">
<uc1:HeadQuote ID="HeadQuote1" runat="server" />
</head>
<uc1:HeadQuote ID="HeadQuote1" runat="server" />
</head>
虽然产生的过程不够漂亮,但至少最终的结果(Html 页面代码)却是令人满意的,希望这篇文章也能对你有所帮助。