Как запретить UpdatePanel вызывать обратную передачу всей страницы?

StackOverflow https://stackoverflow.com/questions/728043

Вопрос

Я использую .NET 3.5 и создаю страницы внутри платформы Community Server 2008.

На одной из страниц я пытаюсь заставить работать UpdatePanel.

Я взял образец прямо с сайта ASP.NET, обновить время в UpdatePanel до текущего времени, нажав кнопку, но по какой-то причине, когда я пытаюсь выполнить эту функцию, вся страница обновляется.

Вот что у меня есть:

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "Panel refreshed at " + DateTime.Now.ToString();
    Label2.Text = "Panel refreshed at " + DateTime.Now.ToString();
}
<asp:ScriptManager ID="ScriptManager1" runat="server"/>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <fieldset>
            <legend>UpdatePanel</legend>
            <asp:Label ID="Label1" runat="server" Text="Panel created."></asp:Label><br />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </fieldset>
    </ContentTemplate>
</asp:UpdatePanel>

Всякий раз, когда я нажимаю кнопку, панель обновляется, но вся страница возвращается!Я вижу, как мигает вся страница.Что, черт возьми, я делаю не так?

Я нахожусь внутри вложенной мастер-страницы, но не уверен, является ли это проблемой.Может ли быть что-то в этой структуре Сервера совместной работы, которую я использую, что вызывает обратную передачу всех событий?

Это было полезно?

Решение

Вы пытались установить Button1 как AsyncPostBackTrigger в разделе «Триггеры»?Установить ChildrenAsTriggers собственность true и UpdateMode собственность Conditional.

protected void Button1_Click(object sender, EventArgs e)
{    
    Label1.Text = "Panel refreshed at " + DateTime.Now.ToString();    
    UpdatePanel1.Update();
}    
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
    <Triggers>        
        <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />    
    </Triggers>    
    <ContentTemplate>        
        <fieldset>            
            <legend>UpdatePanel</legend>            
            <asp:Label ID="Label1" runat="server" Text="Panel created."></asp:Label><br />            
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />        
        </fieldset>    
    </ContentTemplate>
</asp:UpdatePanel>

Другие советы

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

По умолчанию UpdatePanels будет динамически обновлять содержимое внутри них только при срабатывании элементов управления внутри них.Если вам нужно выполнить некоторые более сложные обновления, например, кнопку за пределами панели, вызывающую обновление, или обновление метки на другой панели, тогда вам нужно установить атрибут Conditional на своих UpdatePanel(ах) и выполнить несколько вызовов обновления вручную. в вашем коде.

Другая возможная причина заключается в том, что если на странице ClientIDMode="static", затем элементы управления, которые вы ожидаете обновить, только UpdatePanel обновит всю страницу.

Чтобы устранить проблему, вам просто нужно установить ClientIDMode="AutoID" на элементах управления, которые должны вызвать ответную публикацию UpdatePanel.

Набор ChildrenAsTriggers="true" в вашем элементе управления UpdatePanel.

«По умолчанию UpdatePanels будет динамически обновлять содержимое внутри них только при срабатывании элементов управления внутри них».

В противном случае вся страница будет обновлена!В этом-то и дело!

Если у вас есть старый проект, который был обновлен с .net framework v1.1, удалите эту строку из своей веб-конфигурации, чтобы она заработала:

<xhtmlConformance mode="Legacy"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top