Обновление панелей в повторителях - Почему нельзя одновременно выполнять несколько обратных вызовов? - PullRequest
3 голосов
/ 14 мая 2009

у меня панель обновления в повторителе

(Изменить: я удалил атрибуты Runat и Id, чтобы сообщение выглядело чище)

<asp:Repeater>
    <ItemTemplate>
        <asp:UpdatePanel UpdateMode="Conditional">
            <ContentTemplate>
                 <asp:LinkButton onclick="btnCallback_Click" />
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdateProgress DisplayAfter="0">
            <ProgressTemplate>
                <img src="spinningProgress.gif" />
            </ProgressTemplate>
        </asp:UpdateProgress>
    </ItemTemplate>
</asp:Repeater>

Идея заключается в том, что вы нажимаете LinkButton, и он перезванивает и выполняет действия на стороне сервера для этого элемента данных. Это прекрасно работает для одного предмета. Однако, если я нажимаю кнопку для каждого элемента, не дожидаясь, пока предыдущая панель обновлений завершит обратный вызов, она отменяет предыдущий обратный вызов.

Может ли UpdatePanels не выполнять обратные вызовы одновременно? Могу ли я в любом случае сделать это, чтобы вам не пришлось ждать, прежде чем нажать на следующую кнопку?

Ответы [ 2 ]

2 голосов
/ 14 мая 2009

Каждый запрос AJAX, выполняемый через UpdatePanel, отменяет любой предыдущий (если предыдущий все еще выполняется). Вот как это построено. AJAX-запрос UpdatePanel передает части ViewState вместе с запросом. Невозможно (по крайней мере, очень трудно) согласовать несколько произвольных состояний просмотра, возвращаемых одновременными вызовами AJAX. Я слышал, что это была основная причина, по которой MS решила построить его таким образом.

РЕДАКТИРОВАТЬ: используйте jQuery и получайте удовольствие: -)

0 голосов
/ 29 июля 2009

У меня была такая же проблема раньше. Но я обнаружил, что некоторые хитрости могут позволить вам реализовать несколько обратных вызовов ajax на разных панелях обновлений Microsoft.

function ProcessCallBack(uniqID)
{
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    //checking if there is somewhere perforimg of callback
    if (prm.get_isInAsyncPostBack()) 
    {
        setTimeout("ProcessCallBack()", 1000); //here we move execution of callback 
        //for 1 sec forward
    }
    else
    {
        __doPostBack(uniqID,'');
    }
    return false;
}

Таким образом, вы должны добавить вызов этой функции к вашей кнопке или элементу управления на клике на стороне клиента. uniqID - это уникальный идентификатор управления сервером, вы можете получить его на стороне сервера. Так что наслаждайтесь и помните, что все возможно, но для некоторых нужно много времени, чтобы заняться делом :-) Я думал о том, почему ребята из Microsoft не реализовали такую ​​вещь: -)

...