RadioButtonList внутри UpdatePanel внутри Repeater, могу ли я? - PullRequest
3 голосов
/ 06 мая 2011

У меня есть повторитель с RadioButtonList внутри ItemTemplate, но когда происходит событие RadioButtonList.OnSelectedIndexChanged, он генерирует полную обратную передачу. Что я сделал не так в своем коде ниже? Как я могу получить OnSelectedIndexChanged для генерации обратной передачи в асинхронном режиме?

<asp:UpdatePanel runat="server" ID="UpdatePanel2">
    <ContentTemplate>
        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="sqlOptions">
            <ItemTemplate>
                <asp:UpdatePanel runat="server" ID="pnlA">
                    <ContentTemplate>
                        <strong>
                            <%# Eval("Name") %></strong><br />
                        <asp:RadioButtonList ID="RadioButtonList1" 
                             DataSourceID="sqlOptionValues" runat="server"
                             DataTextField="id" DataValueField="Id" AutoPostBack="true" 
                             OnSelectedIndexChanged="LoadPrice"
                             ValidationGroup="options" />
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
                             ForeColor="Red" runat="server" 
                             ControlToValidate="RadioButtonList1" 
                             ErrorMessage="Required Field" 
                             ValidationGroup="options" />
                        <asp:SqlDataSource ID="sqlOptionValues" runat="server" 
                             ConnectionString="<%$ ConnectionStrings:
                                 ConnectionString6 %>"
                             SelectCommand='<%# "SELECT DISTINCT OptionValue.Name,
                                 OptionValue.Id FROM CombinationDetail 
                                 INNER JOIN OptionValue 
                                 ON CombinationDetail.OptionValueId = OptionValue.Id 
                                 WHERE (OptionValue.OptionId =" + 
                                 Eval("Id") + ")" %>'>
                        </asp:SqlDataSource>
                        <br />
                    </ContentTemplate>
                </asp:UpdatePanel>
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

Большое спасибо за любую помощь:)

Ответы [ 2 ]

11 голосов
/ 10 мая 2011

Это реальный пример использования.У меня есть страница с повторителями, Ajax Accordions внутри других Accordions, панелями обновления внутри других панелей обновления, вы называете это.Страница прекрасно работает, за исключением случаев, когда я хочу обновить одну из панелей Accordion с моим RadioButtonList (RBL).Даже если RBL находится внутри панели обновления, это вызывает обратную передачу всей страницы.Я перепробовал все.Я наконец понял, что это был не я, когда заметил, что мои кнопки будут работать нормально.Я полагаю, что это должно быть ошибкой либо в фреймворке, либо в Ajax Control Toolkit.Я обнаружил, что люди ссылаются на эту ссылку по всему Интернету (http://blog.smarx.com/posts/the-case-of-the-radiobuttonlist-half-trigger.aspx),, но эта ссылка с 2007 года устарела и, вероятно, больше не применима, так что это не поможет.

То, что я в итоге делал, шлос тем, что работает - эта кнопка отправки. Все, что я сделал, это добавил атрибут RBOT для вызова скрытой кнопки. Теперь вы не хотите устанавливать для кнопки значение Visible = false, потому что тогда кнопка не появится в сгенерированномразметка. Вместо этого установите стиль кнопки для отображения: нет, так что никто не увидит этот хак, потому что да, вот что такое обходной путь - это хак, но простой и такой же эффективный, как вы ожидаете.не забудьте удалить Autopostback = "True" из вашего RBL.

CAVEAT: поскольку я использую взломанную кнопку для события onclick, пользователь может щелкнуть в области RBL, нона самом деле не выбрать элемент. Когда это происходит, наш onclick вызывает AsyncPostBack, и логика codebehind будет обработана, поэтому, пожалуйста, имейте это в виду.Вы понимаете, что я имею в виду: все события Page_Load () будут вызваны, но rbl_Questions_SelectedIndexChanged () не будет, если они будут щелкать в области RBL без фактического выбора элемента.Для моих целей это не вызывает проблем в моей логике и не влияет на пользователя.

Вот код:

Где-то на странице .Aspx:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    <ContentTemplate>

        <asp:RadioButtonList ID="rbl_Questions" runat="server"
            OnSelectedIndexChanged="rbl_Questions_SelectedIndexChanged">
        </asp:RadioButtonList>

        <asp:Button ID="btn_rbl_Questions" runat="server" style="display:none;"/>

        <asp:Label ID="lbl_Result" runat="server" Text="" Visible="false">
        </asp:Label>
    </ContentTemplate>  
</asp:UpdatePanel>

В событии Page_Load ():

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack == false)
    {
        //Instead of using the AutoPostback of the RBL, use this instead.
        rbl_Questions.Attributes.Add("onclick",
            "document.getElementById('"
            + btn_rbl_Questions.ClientID
            + "').click();");
        //Bind your RBL to a DataSource, add items programmatically,
        //  or add them in the aspx markup.
    }
}

В событии rbl_Questions_SelectedIndexChanged ():

protected void rbl_Questions_SelectedIndexChanged(object sender, EventArgs e)
{
    //Your code here.
    //My code unhid the lbl_Result control and set its text value.
}


Обновление 05/24/2011

Выше " hack " больше не нужно (я оставляю его выше, так как этобыл помечен как ответ автором).Я нашел лучший способ сделать это, благодаря этому SO Ответ:
Updatepanel дает полную обратную передачу вместо asyncpostback

Код теперь намного проще, просто удалите то, что я поставилв методе Page_Load () и удалите кнопку, которую я использовал на странице Aspx, и добавьте ClientIDMode = "AutoID" и AutoPostBack = "True" к элементу управления, который требуется захватить UpdatePanel.

Где-то вСтраница .Aspx:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">  
    <ContentTemplate>

        <asp:RadioButtonList ID="rbl_Questions" runat="server"
            ClientIDMode="AutoID" AutoPostBack="true"
            OnSelectedIndexChanged="rbl_Questions_SelectedIndexChanged">
        </asp:RadioButtonList>

        <asp:Label ID="lbl_Result" runat="server" Text="" Visible="false">
        </asp:Label>
    </ContentTemplate>  
</asp:UpdatePanel>

MS изменила способ генерации ClientID в .net 4.0 с «AutoID» на «Predictable», и я полагаю, что ScriptManager или UpdatePanel не были обновлены правильно, чтобы использовать его,Я не могу найти документацию о том, почему это где-то или если это было оставлено таким образом.

1 голос
/ 06 мая 2011

Я серьезно не скучаю по winforms.

Попробуйте это:

<asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="pnlA">

Вам также необходимо настроить

<Triggers>
 //radio buttons
</Triggers>

Не знаете, как у вас "Я сделаю это, поскольку это динамически создаваемый список.

...