ASP.NET: кнопка за пределами UpdatePanel не может выполнить обратную передачу

У меня есть форма пожертвования, которая содержит панель обновлений, которая содержит раскрывающийся список для заранее определенных сумм плюс параметр «Другое». Когда выбрано «Другое», раскрывающийся список запускает частичную обратную передачу и отображает панель обновлений с дополнительным текстовым полем «Другое» За пределами этой панели обновлений у меня есть дополнительные поля формы управления сервером, такие как текстовые поля и кнопка для отправки.

Ошибка, с которой я столкнулся, заключается в том, что когда выбрано «Другое», событие кнопки «onclick» не запускает полную обратную передачу.

Пример:

<asp:UpdatePanel ID="updatePanelAmount" runat="server">
    <ContentTemplate>
        <table style="width: 500px;">
        <tbody>
        <tr>
            <th style="width: 200px;"><asp:Label ID="lblAmount" runat="server" CssClass="required" Text="Donation Amount: " /></th>
            <td>
                <asp:DropDownList ID="selAmount" runat="server" />
                <asp:CustomValidator ID="valDonationAmount" runat="server" ControlToValidate="selAmount" ErrorMessage="Donation Amount" Display="None" />
            </td>
        </tr>
        </tbody>
        </table>        
        <asp:Panel ID="panelOther" runat="server" Visible="false">
            <table style="width: 500px;">
            <tbody>
            <tr>
                <th style="width: 200px;"><asp:Label ID="lblOther" runat="server" Text="Other Amount: " /></th>
                <td>
                    $<asp:TextBox ID="txtOther" runat="server" />
                    <asp:RequiredFieldValidator ID="valOther" runat="server" ControlToValidate="txtOther" Display="None" ErrorMessage="Other Amount" Enabled="false" />
                    <asp:RegularExpressionValidator ID="valOtherExpress" runat="server" ControlToValidate="txtOther" Display="None" ErrorMessage="Other Amount: Invalid" ValidationExpression="[1-9][0-9]+(\.[0-9]{2})?" Enabled="false" />
                </td>
            </tr>
            </tbody>
            </table>
        </asp:Panel>                
    </ContentTemplate>           
</asp:UpdatePanel>    
<ctl:CreditCardForm ID="ctlCreditCardForm" runat="server" />
<asp:Button ID="btnSubmit" runat="server" Text="Donate" />

РЕДАКТИРОВАТЬ: публикация кода программной части может упростить всем

public partial class _Default : System.Web.UI.Page
{
    private ArrayList _donations;

    protected void Page_Init(object sender, EventArgs e)
    {
        valDonationAmount.ServerValidate += new ServerValidateEventHandler(valDonationAmount_ServerValidate);        
        selAmount.AutoPostBack = true;
        selAmount.SelectedIndexChanged += new EventHandler(selAmount_SelectedIndexChanged);
        updatePanelAmount.UpdateMode = UpdatePanelUpdateMode.Conditional;
        updatePanelAmount.ChildrenAsTriggers = true;
        btnSubmit.Click += new EventHandler(btnSubmit_Click);
    }

    void selAmount_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (selAmount.SelectedItem.Text == "Other")
        {
            panelOther.Visible = true;
            valOther.Enabled = true;
            valOtherExpress.Enabled = true;
        }
        else
        {
            panelOther.Visible = false;
            valOther.Enabled = false;
            valOtherExpress.Enabled = false;
        }
    }

    void valDonationAmount_ServerValidate(object source, ServerValidateEventArgs args)
    {
        args.IsValid = true;
        if (args.Value == "0")
        {
            args.IsValid = false;
        }
    }

    void btnSubmit_Click(object sender, EventArgs e)
    {
        Page.Validate();                 
        if (Page.IsValid)
        {

        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {    
        _donations = new ArrayList();
        double[] donations = new double[] { 20.00, 50.00, 100.00, 250.00, 500.00 };
        _donations.AddRange(donations);

        if (!IsPostBack)
        {
            foreach (Double d in _donations)
            {
                selAmount.Items.Add(new ListItem(String.Format("{0:c}", d), String.Format("{0:c}", d)));
            }
            selAmount.Items.Insert(0, new ListItem("Select Donation Amount","0"));
            selAmount.Items.Add(new ListItem("Other", "Other"));
        }        
    }
}

person Ehren Dames    schedule 24.02.2009    source источник
comment
Я просмотрел другой пример (stackoverflow.com/questions/180366/), что установка btnSubmit.UseSubmitBehavior = false должна решить проблему. Я не обнаружил, что это так.   -  person Ehren Dames    schedule 25.02.2009
comment
Я продолжаю тестировать и нахожу что-то интересное. Когда панель обновлений отображается из раскрывающегося списка «Другое», я нажимаю кнопку с отслеживанием любых инициированных запросов с помощью FireBug и ничего. Но когда я даю txtOther значение, я получаю обратную передачу. Я этого не понимаю. Кто-нибудь знает?   -  person Ehren Dames    schedule 25.02.2009
comment
Последний комментарий звучит очень странно. Может быть, это ошибка браузера? Какой браузер вы используете? Вы пробовали это в других? Кроме того, какое поведение вы получите, если избавитесь от UpdatePanel (т.е. сделаете все с полной обратной передачей)?   -  person teedyay    schedule 25.02.2009
comment
В FireFox 3 и Internet Explorer 7 он ведет себя одинаково. Я попробовал это в Google Chrome, и поведение другое. Автоотправка в раскрывающемся списке не обновляет панель, или я не уверен, отправляет ли она запрос. Я попробую вырезать панель обновлений и посмотреть, что она делает.   -  person Ehren Dames    schedule 25.02.2009


Ответы (4)


Возможно, вас блокирует валидатор? Ваша кнопка должна игнорировать какие-либо валидаторы? Если это так, вы должны установить для кнопки CausesValidation = "false", чтобы она срабатывала, даже если валидаторы на панели недействительны.

В противном случае событие нажатия кнопки будет остановлено валидаторами на панели.

person Jay S    schedule 25.02.2009
comment
Да! Это объясняет, почему я мог сделать следующее: $ ('# ‹% = btnSubmit.ClientID%›'). Click (function () {__doPostBack ('‹% = btnSubmit.UniqueID%›', '');}) ; Это должен был быть сценарий на стороне клиента, предотвращающий обратную передачу. - person Ehren Dames; 25.02.2009
comment
Большое спасибо. Я хотел знать, почему, вместо того, чтобы использовать обходной путь. Мне следовало бы больше проследить через сгенерированный JS. Мог бы найти ответ. - person Ehren Dames; 25.02.2009

AJAX вызывает некое странное поведение с обратными передачами, сессиями и т. Д.

<asp:Button ID="btnSubmit" runat="server" Text="Donate" onClick="btnSubmit_Click" />

Изменить: Также попробуйте следующее: Убедитесь, что ваша проводка не находится в блоке «if (! IsPostBack)».

person tsilb    schedule 25.02.2009

Поместите код ниже за пределами панели обновления.

<%--dummy validator to make ajax validation possible--%>
        <asp:RequiredFieldValidator runat="server" CssClass="hidden" ControlToValidate="dummyTextBox" ValidationGroup="dummy"></asp:RequiredFieldValidator>
        <asp:TextBox runat="server" ID="dummyTextBox" CssClass="hidden"></asp:TextBox>

        <style>
    .hidden {
      display: none;
    }
    </style>

Ссылка ниже работала для меня ....

http://jeffreypaarhuis.com/2011/08/08/validation-not-working-in-updatepanel/

person Damitha    schedule 14.05.2013

Проверьте свойство AutoPostBack элемента управления Button. Установите значение «True».

person HardCode    schedule 24.02.2009
comment
По умолчанию кнопки работают с функцией AutoPostback. - person tsilb; 25.02.2009