Състоянието на ретранслатора не се запазва след обратно изпращане, когато е в панел

Имам следната структура на кода в маркирането:

        <asp:Panel ID="Panel1" runat="server" Title="TestPanel" Visible="true">
          <asp:GridView ID="grd1" runat="server" AutoGenerateColumns="true">        
          </asp:GridView>
          <myControl:RepeaterUserControl ID="rpt"></myControl:RepeaterUserControl>
        </asp:Panel>

Панелът се използва за контрол на видимостта (понастоящем зададено true за всички времена). Контролата „RepeaterUserControl“ е потребителска контрола, която съдържа asp повторител с два бутона, наречени „Ok“ и „Cancel“ (всички първоначално зададени display:none). Цялото това съдържание на потребителския контрол се показва на страницата като модален изскачащ прозорец (с използване на модален изскачащ разширител) при щракване върху бутон „Извикване“, който също е част от потребителския контрол.

<div id="div1" runat="server">
    <ajax:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="divDialog"
        TargetControlID="btnDummyInvoker" CancelControlID="imbClose" PopupDragHandleControlID="divDialogTitle"
        BackgroundCssClass="modalBackground">
    </ajax:ModalPopupExtender>
    <div style="height: 4px;">
    </div>
    <asp:Button ID="btnInvoke" runat="server" OnClick="btnInvoke_Click" Text="Invoke"
        Width="90px" />
    <div style="display: none; position: absolute;">
        <asp:Button ID="Button2" runat="server" />
    </div>
    <div id="div2" runat="server" style="display: none;">
        <asp:Repeater ID="rptList" runat="server">
            <ItemTemplate>
                <tr>
                    <td>
                        <asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayText").ToString() %>'></asp:Label>
                    </td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
        <asp:Button ID="btnOk" runat="server" OnClick="btnOk_Click" />
        <asp:Button ID="btnCancel" runat="server" />
    </div>
</div>

И така, под решетката потребителят вижда бутон (Извикване) на страницата, при щракване върху който контролата на повторителя и бутоните Ok/Отказ се показват в модалния изскачащ прозорец. На ретранслатора е присвоен източник на данни, който съдържа списъка с елементи, потребителят прави промени и при OK щракване на изскачащия прозорец, от кода зад (ok OnClick събитие) влизам в ретранслатора като rptList.Items.Count, за да извърша допълнителни операции.

Сега проблемът. Ако потребителският контрол е извън панела, той перфектно ми връща правилния брой елементи, но ако userControl е вътре в панела (както е показано в кода), броят се връща при щракване върху OK бутонът е '0' след обратна поща. защо ретранслаторът губи състоянието си в този случай?

Актуализация: Добавяне на кодов фрагмент от задния код, ако това помага за решаването на проблема

//This is from the user control code
 protected void btnInvoke_Click(object sender, EventArgs e)
        {   
          rptList.DataSource = listToBeBoundToRepeater;
          rptList.DataBind();
          modalPopupExtender.Show();             
        }

//This is from the user control code
 protected void btnOk_Click(object sender, EventArgs e)
        {

            for (int itemIndex = 0; itemIndex < rptList.Items.Count; itemIndex++)
            {
               // business logiv
            }

        }

rptList.Items.Count е 0 за мен след връщане за случая, който описах.

update2 : Ето странното решение, което получих, затворих решетката и повторителя с етикет и зададох свойството runat на сървър, за да го направя сървърна контрола. Сега стойностите на повторителя след обратното изпращане се запазват правилно. Странно, но сега работи.


person Gaurav    schedule 10.05.2012    source източник


Отговори (3)


Ето странното решение, което получих, затворих решетката и повторителя с етикет и зададох свойството runat на сървър, за да го направя сървърна контрола. Сега стойностите на повторителя след обратното изпращане се запазват правилно. Странно, но сега работи.

person Gaurav    schedule 20.08.2013
comment
Опитах около 10 различни решения и това в комбинация с винаги обвързване на данни, вместо да не го правя при обратно изпращане, реши проблема за мен. - person MattJeanes; 02.06.2016

за <asp:UpdatePanel ID="UpdatePanel1" runat="server">, дефинирайте AsyncPostbackTrigger като btnInvoke

person rt2800    schedule 10.05.2012
comment
Здравейте, игнорирайте панела за актуализация. проблемът си е там и без него. - person Gaurav; 10.05.2012

Редактиране: Премахнах предишния отговор.
Опитах се да симулирам проблема ви, доколкото е възможно, като използвах основен панел, съдържащ потребителски контрол, който съдържа ретранслатор, който се показва с ajaxcontroltoolkit.
Уви, броят на моите ретранслатори винаги е правилен.
Страница на контейнера :

<%@ Register TagPrefix="a" TagName="test" Src="cc.ascx" %>

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManager1" runat="server" />   
    <asp:Panel ID="Panel1" runat="server" Title="TestPanel" Visible="true">
        <a:test runat="server" ID="test"></a:test>
    </asp:Panel>
</asp:Content>

потребителски контрол cc aspx:

<%@ Register TagPrefix="ajax" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit, Version=4.1.60501.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" %>

<div id="div1" runat="server">
    <ajax:ModalPopupExtender ID="ModalPopupExtender1" runat="server" PopupControlID="divDialog"
        TargetControlID="btnDummyInvoker"
        BackgroundCssClass="modalBackground">
    </ajax:ModalPopupExtender>
    <asp:Button runat="server" style="display:none" ID="btnDummyInvoker"/>
    <div style="height: 4px;">
    </div>
    <asp:Button ID="btnInvoke" runat="server" OnClick="btnInvoke_Click" Text="Invoke" Width="90px" />
    <div style="display: none; position: absolute;">
        <asp:Button ID="Button2" runat="server" />
    </div>
    <div id="divDialog" runat="server" style="display: none;">
        <asp:Repeater ID="rptList" runat="server">
            <ItemTemplate>
                <tr>
                    <td>
                        <asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayText").ToString() %>'></asp:Label>
                    </td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
        <asp:Button ID="btnOk" runat="server" OnClick="btnOk_Click" />
        <asp:Button ID="btnCancel" runat="server" />
    </div>
    <asp:TextBox runat="server" ID="result"></asp:TextBox>
</div>

потребителски контролен код зад:

public partial class cc : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnInvoke_Click(object sender, EventArgs e)
        {
            var list = new List<Data>();
            list.Add(new Data { DisplayText = "one" });
            list.Add(new Data { DisplayText = "two" });
            rptList.DataSource = list;
            rptList.DataBind();
            ModalPopupExtender1.Show();
        }

        protected void btnOk_Click(object sender, EventArgs e)
        {
            var count = rptList.Items.Count;
            result.Text = count.ToString();
        }
    }
person Kristof    schedule 10.05.2012
comment
Здравейте, моля, игнорирайте панела за актуализация. проблемът си е там и без него. Премахнах го от кода, изрязан от основната публикация. - person Gaurav; 10.05.2012
comment
Лошото ми, виждането на панел за актуализиране обикновено предизвиква червен флаг, особено ако данните не изглеждат прехвърлени. Бихте ли могли да покажете малко повече код от вашия код отзад? Интересувам се да видя как и кога точно свързвате своя източник на данни (page_load, page_init) и как и кога правите преброяването. Бихте ли предоставили някои фрагменти и за това? - person Kristof; 10.05.2012
comment
Също така: само за да премахна всички глупави възможности. Можете ли да преименувате Panel1 на нещо друго без думата panel в него? Имах един случай, в който това беше резултат от грешка, която получих. - person Kristof; 10.05.2012
comment
Здравейте, благодаря за помощта. Актуализирах публикацията с кода зад кода. Също така името е панел само в този пример, в моя код името е нещо друго. :) - person Gaurav; 10.05.2012
comment
Опитвам се да възпроизведа вашия проблем, но засега не успявам. Може би бихте могли да работите с мен за опростяване на този проблем. Бихте ли опитали да елиминирате персонализирания потребителски контрол и да ме уведомите дали проблемът е решен по този начин? - person Kristof; 10.05.2012
comment
не мога да премахна персонализираната контрола, тъй като съдържа логика, важна за страницата, освен това съм използвал същата контрола на 20 други места и тя работи добре навсякъде другаде. Знам, че проблемът е странен и труден за обяснение :( - person Gaurav; 10.05.2012
comment
Ще внедря персонализирания контрол и ако решението ми все още стои, ще го публикувам тук. След това можете или да коментирате къде направих нещо различно от вас, или да сравните с вашето внедряване, за да видите разликите. - person Kristof; 10.05.2012
comment
Ето странното решение, което получих, затворих мрежата и ретранслатора с таг ‹div› и зададох свойството runat на сървър, за да го направя сървърна контрола. Сега стойностите на повторителя след обратното изпращане се запазват правилно. Странно, но сега работи. - person Gaurav; 10.05.2012