ASP.NET: обновление UpdatePanel вручную с помощью jQuery - PullRequest
0 голосов
/ 22 сентября 2009

У меня проблемы с обновлением ASP: UpdatePanel с использованием javascript (jQuery). Вот что у меня есть.

Я использую скрытый трюк с кнопкой, так как мне кажется, что я не могу получить ClientID панели обновлений для трюка __doPostBack).

<asp:UpdatePanel runat="server" ID="pnlUpdate">

<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnUpdate" />
</Triggers>

<ContentTemplate>

<asp:UpdateProgress runat="server" AssociatedUpdatePanelID="pnlUpdate" DynamicLayout="false" DisplayAfter="100">
<ProgressTemplate>
<img alt="Laddar..." src="img/loader.gif" width="16" height="11"/>  
</ProgressTemplate>
</asp:UpdateProgress>

<div style="display:none;">  
<asp:Button runat="server" ID="btnUpdate" CommandName="Refresh" CommandArgument='<%# Eval("Id") %>'/>
</div>

<asp:Repeater runat="server" Id="rptrEnquiry">
...
</asp:Repeater>


<%= DateTime.Now.ToString() %>

<a href="javascript:jQuery('#<%= btnUpdate.ClientID %>').trigger('click')&&undefined;">Fire!</a>

</ContentTemplate>

</asp:UpdatePanel>

В коде, который обрабатывает btnUpdate (в GridView RowCommand), rptrEnquiry восстанавливается при нажатии btnUpdate.

Если я нажимаю кнопку напрямую (пока не скрыто), все работает отлично (отображается updateprogess, обновляется дата и ретранслятор обновляется.

Но если я нажму на ссылку огня и активирую кнопку через javascript, обновится только дата, но прогресс обновления не отобразится, а ретранслятор не восстановится. Во время отладки я вижу, что код восстановления выполнен, но его эффект отсутствует в обновлении.

Ответы [ 2 ]

6 голосов
/ 23 сентября 2009

Хорошо, так что мне удалось решить свои проблемы, полностью перестроив все это. Несколько уроков, которые могут помочь кому-то еще:

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

http://encosia.com/2007/10/24/are-you-making-these-3-common-aspnet-ajax-mistakes/ было очень полезно.

Обновления в панели обновлений контролируются в PreRender. При использовании __EVENTTARGET обновляется только интересующая нас панель.

protected void pnlUpdate_PreRender(object sender, EventArgs args)
{
    if (Request["__EVENTTARGET"] == pnlUpdate.ClientID)
    {
        PreBind();

        switch(Request["__EVENTARGUMENT"])
        {
            case "toggle":
                Toggle();
                break;
            case "purchase":
                Purchase();
                break;
            case "update":
                /* nop */
                break;
        }

        Bind();
    }
}

Чтобы __EVENTTARGET имел правильный clientId (это пустая строка при использовании кнопки), мне нужно было запустить обновление панели, используя javascript:

<a href="javascript:__doPostBack('<%=  pnlUpdate.ClientID %>','toggle');">
<img runat="server" ID="imgToggle" src="~/img/grid_plus.gif" title="Expandera" alt="" width="14" height="14"/>
</a>
3 голосов
/ 22 сентября 2009

Вы пробовали что-то подобное? (Взято из Легко обновите панель обновления, используя JavaScript ).

есть простой способ запуска постбэк, нацеленный на UpdatePanel: __doPostBack ().

Пока цель события Вызов __doPostBack () является асинхронным триггером UpdatePanel, ASP.NET AJAX фреймворк будет перехватывать постбэк и частичный постбэк вместо этого.

<a href="#" onclick="__doPostBack('<%= pnlUpdate.ClientID %>', '');"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...