PeejayAdams Ответов: 3

ASP.NET/AJAX Updatepanel показывает дважды


Я уже давно не прикасался к аспиду и начинаю вспоминать почему!

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

Панель обновления выглядит следующим образом:
<asp:UpdatePanel runat="server" Visible="true" ID="pnlSproc" UpdateMode="Conditional" ChildrenAsTriggers="true">
    <ContentTemplate>
        .
        .
        .
            <asp:Repeater runat="server" ID="rptParameters" EnableViewState="true" OnItemCreated="rptParameters_ItemCreated" >
                <ItemTemplate>
                    <tr>
                        .
                        .
                        .
                        <td>
                            <asp:Button runat="server" ID="btnAddParameter" />
                        </td>
                    </tr>
                </ItemTemplate>
            </asp:Repeater>
        </tr>
    </ContentTemplate>
</asp:UpdatePanel>

Событие ItemCreated ретранслятора добавляет кнопку в качестве асинхронного триггера ...
protected void rptParameters_ItemCreated(object source, RepeaterItemEventArgs e)
{
    ScriptManager manager = ScriptManager.GetCurrent(this);

    Button button = (Button)e.Item.FindControl("btnAddParameter");

    if (button != null)
    {
        button.Click += AddParameterClick;
        manager.RegisterAsyncPostBackControl(button);
    }
}

Когда событие срабатывает, все соответствующие события срабатывают, как и ожидалось, но панель отображается дважды - один раз в обновленном виде (выше страницы, чем должно быть) и один раз в исходном виде и положении.

Если я изменю вызов RegisterAsyncPostBackControl на RegisterPostBackControl, все будет работать так, как я ожидал, но, очевидно, я получу полный постбэк страницы, который мне не нужен.

Кто-нибудь сталкивался с чем-то подобным раньше? Это, конечно, выглядит так, как будто это асинхронный постбэк, который вызывает проблему рендеринга (это происходит как в IE, так и в Chrome, и моя наценка выглядит полностью корректной. Я попытался переместить менеджер сценариев со страницы на мастер, но это тоже не дало никакого эффекта.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Вы обновляете панель обновления внутри события AddParameterClick? Можете ли вы показать код этого события?

PeejayAdams

Привет Тадит,

Да это происходит в AddParameterClick

охраняемых недействительными AddParameterClick(объект отправителя, EventArgs в электронной)
{
если (_parameters == нуль)
_parameters = новый список<ProcedureParameter>();

foreach (RepeaterItem item in rptParameters.Предметы)
{
Имя текстового поля = (TextBox)элемент.FindControl("tbParameterName");
TextBox value = (текстовое поле)элемент.FindControl("tbParameterValue");

_параметры.Add(new ProcedureParameter(name.Текстовое значение.Текст));
}

_параметры.Добавить(новый процедурный параметр());

rptParameters.Источник данных = _parameters;
rptParameters.Привязку();
пнлспрок.Обновление();
}

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Следуйте моему ответу. Дайте мне знать, работает ли это или нет, добавив комментарии внутри самого поля ответа.

3 Ответов

Рейтинг:
19

PeejayAdams

Ну, я знал, что использование таблиц было немного непослушным (я действительно не хотел идти по пути CSS для одной страницы, внутренней веб-формы), но панель обновления создается как div, и это путается с таблицей, и в этом заключается проблема.

Как только я сменил свою таблицу на дивы и абзацы, все это начало работать.

Мораль этой истории: короткий путь редко бывает коротким.


Рейтинг:
0

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Решение


Почему вы динамически добавляете кнопку в качестве триггера? Вы делаете это потому, что вызываете одно пользовательское событие, которое "AddParameterClick".

Все, что вы делаете внутри этого события, может быть сделано внутри самого события. ItemCommand[^] Само событие. И вы можете заявить: ItemCommand Событие как асинхронный триггер.

Через Класс RepeaterCommandEventArgs[^], вы можете получить все подробности о строке, из которой вы получили команду.

Итак, резюме есть...
  1. Объявите об этом ItemCommand как спусковой крючок вроде бы...
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="rptParameters" EventName="ItemCommand" />
    </Triggers>
  2. Объявлять ItemCommand для ретранслятора. Удалить ItemCreated, которая больше не нужна.
    <asp:Repeater runat="server" ID="rptParameters" EnableViewState="true" OnItemCommand="rptParameters_ItemCommand" >

  3. Внутри дома ItemCommand, делайте то, что вы пытаетесь сделать внутри AddParameterClick.


PeejayAdams

Спасибо, Тадит. Ваше решение, конечно, более опрятно, чем мое, но конечный результат точно такой же. Я все еще получаю обновленную панель, появляющуюся в неправильном месте.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Меня сейчас нет в офисе. Постараюсь повторить и исправить это завтра.

Рейтинг:
0

Member 14987943

Дайте id и напишите runat server в вашу таблицу внутри панели обновления