2009-02-24 2 views
0

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

Ошибка, с которой я сталкиваюсь, Другое»выбрана кнопка„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" /> 

EDIT: Проводка коды фоновой может сделать это проще для всех

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")); 
     }   
    } 
} 
+0

я смотрел под другим примером (http://stackoverflow.com/questions/180366/losing-button-click-events -after-first-partial-postback-in-updatepanel), чтобы установить проблему «btnSubmit.UseSubmitBehavior = false», чтобы исправить эту проблему. Я не нахожу, что это так. –

+0

Я продолжаю проверять его и находить что-то интересное. Когда панель обновления отображает из раскрывающегося списка «Другое», я нажимаю кнопку, наблюдая за любыми запрошенными запросами с FireBug и ничего. Но, когда я даю txtOther значение, я получаю обратную передачу. Я этого не понимаю. Кто-нибудь знает? –

+0

Этот последний комментарий звучит очень странно. Может быть, это может быть ошибка браузера? Какой браузер вы используете? Вы пробовали это в других? Также, какое поведение вы получаете, если избавляетесь от UpdatePanel (т. Е. Делаете все в полной обратной передаче)? – teedyay

ответ

1

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

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

+0

Да! Это объясняет, почему я мог бы сделать следующее: $ ('# <% = btnSubmit.ClientID%>'). Click (function() { __doPostBack ('<% = btnSubmit.UniqueID%>', '') ; }); Это должен быть сценарий на стороне клиента, который сохраняет обратную передачу. –

+0

Большое вам спасибо. Я хотел знать, почему вместо использования обходного пути.Я должен проследить через сгенерированный JS больше. Мог бы найти ответ. –

-3

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

+0

Кнопки AutoPostback по умолчанию. – tsilb

0

AJAX вызывает некоторые фанки поведение с постбэков, сессии и т.д.

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

Edit: Кроме того, попробуйте следующее: Убедитесь, что провод вверх не в «если (IsPostBack!)» Блок.

+0

Дал ему попробовать. Извините, нет. –

0

Введите код, расположенный за пределами панели обновлений.

<%--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/

Смежные вопросы