错误"控件集合无法..."的含义和解决方法
使用ASP.NET 2.0,我有一个Web应用程序,我试图在该应用程序中使用JavaScript来使选项卡容器中的一个选项卡成为活动选项卡。
这些建议基于:
var mX=document.getElementById('<%= tc1.ClientID%>') $find('<%= tc1.ClientID%>').set_activeTabIndex(1);
两者都会产生错误:
The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).
我试过将代码从head标签移到body标签中。同样的错误。
我也尝试了替代方法<%tc1.ClientID%>,如下所示:
var mX = document.getElementById('<%# tc1.ClientID %>') mX.ActiveTabIndex="2";
生成一个空错误代码,上面在html中呈现为:
var mX = document.getElementById('') mX.ActiveTabIndex="2";
谁能用通俗的语言解释这意味着什么以及解决方案是什么?
解决方案
看起来和听起来好像这些代码片段本身并不是冒犯性的,但是正在修改控件集合的其他一些代码现在对此感到不安。我们能说出程序中实际发生错误的地方吗?
顺便说一句,<%%>不适合这里,它仅适用于数据绑定控件。
我们不能将代码块与控件混合在一起,而是将值存储在javascript中并以这种方式进行分配...类似这样:
<div runat="server" id="rawr"> <span id="myspan">HI</span> </div> </form> <script type="text/javascript"> var obj = '<%= DateTime.Now.ToShortDateString() %>'; var ele = document.getElementById("myspan"); ele.innerHTML = obj; </script>
我实际上曾经遇到过。这是一个解释:http://west-wind.com/WebLog/posts/6148.aspx
例如,如果标记如下所示:
<asp:Panel id="whatever" runat="server"> <script type="text/javascript"> var mX=document.getElementById('<%= tc1.ClientID%>'); //and so on... </script> </asp:Panel>
而且,如果我们尝试以编程方式向该面板添加控件,它将因我们收到的错误而失败。
一种解决方案是将Javascript放在页面的其他位置。另一种方式(尽管是hack)是这样的:
<asp:Panel id="whatever" runat="server"> <asp:PlaceHolder id="dontCare" runat="server"> <script type="text/javascript"> var mX=document.getElementById('<%= tc1.ClientID%>'); //and so on... </script> </asp:PlaceHolder> </asp:Panel>
现在,<%= ...%>部分位于PlaceHolder内部,而不是直接位于Panel内部。现在,可以将Cor VB代码中的控件添加到面板上了(尽管添加控件到PlaceHolder会失败。)
编辑:
是的,我也尝试使用<%...%>,但这仅用于DataBound控件中。例如,如果它位于DataGrid的中间,而我将其称为PostB的DataBind()方法,则该方法有效。
如果我们刚刚开始使用ASP.NET MVC,则可以解决此隐患。如果有另一个像我这样的人遇到这个问题,我真的在这里留了下来,我真的想避免那个人因为这个la脚的错误而浪费自己的时间:
更改<SCRIPT>标签的位置!!!
我们很可能希望在Site.Master页面上放置一些javascript,但是当我们添加jQuery时,将其放在了标签下方。不,先生!请在<head>之外的<body>中包括<script>标签和javascript代码。祝你好运!