JavaScript, сгенерированный управлением asp.net SciptManager, кажется, имеет ошибку, и наклон обрабатывают скрытый UpdatePanels. Ошибка JavaScript брошена, когда управление в одной обновленной панели пытается сделать другую панель обновления видимой.
Действительно ли это - ошибка с Ajax ASP.NET? И у кого-либо есть какие-либо идеи, как обойти это?
Вот пример того, что я пытаюсь сделать
<script type="text/C#" runat="server">
protected void LinkButton1_Click(object sender, EventArgs e)
{
Panel1.Visible = true;
}
</script>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="Show Panel"></asp:LinkButton>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Panel ID="Panel1" runat="server" Visible="false">
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
blah bla blah
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
Это - ошибка JavaScript, которая брошена при нажатии на ссылку "LinkButton1". Эта ошибка прибывает из JavaScript, который сгенерирован управлением asp.net ScriptManager
Error: Sys.InvalidOperationException: Could not find UpdatePanel with ID 'ctl00_ContentPlaceHolder1_UpdatePanel2'
Вы столкнулись с проблемами, потому что содержимое Panel1 не отображается при первом отображении страницы. Это приводит к неправильной инициализации UpdatePanel2.
(Диспетчер запросов страниц, который управляет всеми частичными обновлениями, должен знать о существовании UpdatePanel2, и этого просто не произойдет, если он не отображается. Кроме того, если подумать, панель обновлений должна отображать некоторые элементы, если только добавить div-заполнитель, в который он будет вставлять свое содержимое при частичной обратной передаче).
Я не знаю точно, чего вы пытаетесь достичь, но если вы просто хотите, чтобы ваш UpdatePanel2 запускался элементом управления, который не находится внутри панели обновления, установите LinkButton1 в качестве такого триггера.
<script runat="server">
protected void LinkButton1_Click(object sender, EventArgs e)
{
blabla.Visible = true;
}
</script>
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
</asp:ScriptManager>
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="Show Panel"></asp:LinkButton>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" >
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LinkButton1" />
</Triggers>
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="blabla" Visible="false">
blah bla blah
</asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
Если LinkButton1 действительно должен находиться внутри панели обновления (возможно, LinkButton1 не всегда виден?), Вы можете сделать что-то вроде следующего
<script runat="server">
protected void LinkButton1_Click(object sender, EventArgs e)
{
blabla.Visible = true;
UpdatePanel2.Update();
}
</script>
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" >
<ContentTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="Show Panel"></asp:LinkButton>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional" >
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LinkButton1" />
</Triggers>
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="blabla" Visible="false">
blah bla blah
</asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
Ошибка, которую вы получаете, связана не с JavaScript, а с ASP.NET.
Вы получаете ее потому, что пытаетесь сделать видимой Panel1
, которая находится вне UpdatePanel
, которую вы вызываете, а это невозможно.
Все, что вы собираетесь обновить на веб-странице, должно находиться внутри вызываемой вами UpdatePanel
.