Коллекция Controls не может быть изменена, потому что элемент управления содержит блоки кода (то есть <% ...%>) - PullRequest
4 голосов
/ 21 июля 2011

Я застрял с этой ошибкой и нашел обходной путь, и решения работают для меня, но я хотел бы знать, является ли это лучшим способом решения проблемы, и я хочу убедиться, что это не повлияет на другие страницы плохо , Надеюсь, что эксперты помогут. Если это было лучшее решение, то многие из вас могут спасти свои головы.

Эта ошибка возникает, когда кодовый блок помещается в MasterPage. Поместите блок кода в заполнитель для решения проблемы. При добавлении расширений AJAX на вашу веб-страницу он попытается зарегистрировать сценарии в заголовке. Если в MasterPage присутствуют блоки кода, может возникнуть ошибка.

Чтобы решить эту проблему, просто переместите блок кода в заполнитель в заголовке вашей MasterPage, например, так:

<head id="Head1" runat="server">
    <title>Untitled Page</title>
    <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
    <asp:ContentPlaceHolder ID="myPlaceholder" runat="server">
    <script language="javascript" type="text/javascript" src="<%= Page.ResolveClientURL("~/javascript/global.js")%>"></script>
    </asp:ContentPlaceHolder>
    <asp:ContentPlaceHolder ID="head" runat="server"></asp:ContentPlaceHolder>
</head>

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Ошибка логична, вы не можете перепутать визуализированные элементы управления после того, как они отрисованы с помощью <%= %>

Одним из способов решения этой проблемы является использование литерального элемента управления и визуализация строки сценария в коде позади.

<asp:ContentPlaceHolder ID="myPlaceholder" runat="server">
    <asp:Literal runat="server" ID="txtIncludeScript" EnableViewState="false"></asp:Literal>
</asp:ContentPlaceHolder>

и по коду позади. Проверьте на ноль, потому что если вы измените заполнитель, литерал будет нулевым. Также установите EnableViewState = false, потому что вы устанавливаете его на каждом Page_Load, и вы не хотите сохранять его в viewstate.

  if(txtIncludeScript != null)
  {
    txtIncludeScript.Text = 
string.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>",   
Page.ResolveClientUrl("~/javascript/global.js"));
  }
0 голосов
/ 16 апреля 2012

ContentPlaceHolder требует главной страницы, поэтому вы можете заменить этот тег другим элементом, который можно запустить на сервере, если на вашей странице нет главной страницы и вы не можете избавиться от

<head id="Head1" runat="server">
 <title>Untitled Page</title>
 <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
 <div runat="server">
  <script language="javascript" type="text/javascript" src="<%= Page.ResolveClientURL("~/javascript/global.js")%>"></script>
 </div>
 <asp:ContentPlaceHolder ID="head" runat="server"></asp:ContentPlaceHolder>
</head>
...