ASP.NET updatepanel внутри скрытой панели возможная ошибка - PullRequest
6 голосов
/ 27 мая 2010

JavaScript, сгенерированный элементом управления asp.net SciptManager, похоже, содержит ошибку и не может обработать скрытые панели обновления. Ошибка JavaScript возникает, когда элемент управления в одной обновленной панели пытается сделать видимой другую панель обновления.

Это ошибка в ASP.Net AJAX? А у кого-нибудь есть идеи как обойти это?

Вот пример того, что я пытаюсь сделать

<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'

Ответы [ 2 ]

3 голосов
/ 29 мая 2010

Вы столкнулись с проблемами, потому что содержимое 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>
2 голосов
/ 27 мая 2010

Ошибка, которую вы получаете не из JavaScript, а из ASP.NET.

Вы получаете это, потому что пытаетесь сделать видимым Panel1, который находится вне UpdatePanel, как вы его называете, и это невозможно.

Все, что вы собираетесь обновить на веб-странице, должно быть внутри UpdatePanel, который вы вызываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...