2016-01-08 8 views
0

У меня есть две панели, каждая из которых имеет форму. Сначала они спрятаны, а выбор переключателя сделает 1 панель видимой. Один - для платежей по кредитным картам, а другой - для echecks. Код работает для этого, но есть один глюк. Опция echeck сначала очищает форму при отправке, а затем передает форму во втором клике.Две панели с формами, которые переключаются на радиокнопку

Как я могу получить 2-ю панель (чеки), чтобы отправить форму, когда она была выбрана переключателем в первый раз? Это связано с Page.IsPostBack или, может быть, как мои инструкции if находятся в разделе Page_Load?

Вот кнопки 2 радио

<asp:RadioButton ID="RadioButton1" runat="server" GroupName="RbPayment" OnCheckedChanged="RadioButton1_CheckedChanged" Text="Credit Card" Checked="True" AutoPostBack="True" /> 
    <asp:RadioButton ID="RadioButton2" runat="server" GroupName="RbPayment" OnCheckedChanged="RadioButton2_CheckedChanged" Text="Check" AutoPostBack="True" /> 

Здесь у меня есть 2 панели и образует

<asp:Panel ID="PanelCard" runat="server" Visible="false" OnLoad="RadioButton1_CheckedChanged"> 
     <%--Form here--%> 
     <asp:Button ID="Button1" runat="server" Text="Submit Payment" ClientIDMode="Static" CssClass="formbutton" /> 
</asp:Panel> 
<asp:Panel ID="PanelCheck" runat="server" Visible="false" OnLoad="RadioButton1_CheckedChanged"> 
     <%--Form here--%> 
     <asp:Button ID="Button1" runat="server" Text="Submit Payment" ClientIDMode="Static" CssClass="formbutton" /> 
</asp:Panel> 

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

protected void RadioButton1_CheckedChanged(object sender, EventArgs e) 
    { 
     if (RadioButton1.Checked) 
     { 
      PnlCard.Visible = true; 
      PnlCheck.Visible = false; 
     } 

     if (RadioButton2.Checked) 
     { 
      PnlCard.Visible = false; 
      PnlCheck.Visible = true; 
     } 

    } 

    protected void RadioButton2_CheckedChanged(object sender, EventArgs e) 
    { 
     if (RadioButton1.Checked) 
     { 
      PnlCard.Visible = true; 
      PnlCheck.Visible = false; 
     } 

     if (RadioButton2.Checked) 
     { 
      PnlCard.Visible = false; 
      PnlCheck.Visible = true; 
     } 
    } 

Здесь я думаю, что проблема в том, что я не уверен, что нужно исправить.

protected void Page_Load(object sender, System.EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      BtnSubmitCard.PostBackUrl = "https://secure2.authorize.net/gateway/transact.dll"; 
      //Other code here for the form 
      } 

     if (PnlCard.Visible == true) 
     { 
      BtnSubmitCard.PostBackUrl = "https://secure2.authorize.net/gateway/transact.dll"; 
      //Other code here for the form 
     } 

     if (PnlCheck.Visible == true) 
     { 
      BtnSubmitCheck.PostBackUrl = "https://secure2.authorize.net/gateway/transact.dll"; 
      //Other code here for the form 
     } 
    } 
+1

это звучит как проблема с IsPostBack .. возможно, вы могли бы сделать это с помощью UpdatePanel, вместо этого это будет делать частичные обратные вызовы – MethodMan

+0

Являются ли эти формы серверными элементами? asp.net может обрабатывать только одну серверную форму на странице. Может ли это вызвать вашу проблему? – Sami

+0

@MethodMan Спасибо, я просто попробовал это, но это не сработает, потому что я использую некоторые поля «ввода» (из-за безопасности для платежного шлюза). – SummerDays

ответ

2

Ваша сторона кода кажется твердой, но, как было предложено в первом комментарии, это действительно проблема обратной передачи. Вы должны использовать UpdatePanel для каждой из секций, чтобы изменить видимость на лету, как это, смотрите ниже:

<asp:UpdatePanel runat="server"> 
<ContentTemplate> 
<asp:Panel ID="PanelCard" runat="server" Visible="false" OnLoad="RadioButton1_CheckedChanged"> 
    <%--Form here--%> 
    <asp:Button ID="Button1" runat="server" Text="Submit Payment" ClientIDMode="Static" CssClass="formbutton" /> 
    </asp:Panel> 
    <asp:Panel ID="PanelCheck" runat="server" Visible="false" OnLoad="RadioButton1_CheckedChanged"> 
    <%--Form here--%> 
    <asp:Button ID="Button1" runat="server" Text="Submit Payment" ClientIDMode="Static" CssClass="formbutton" /> 
</asp:Panel> 
</ContentTemplate> 
</asp:UpdatePanel> 

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

EDIT: вам также нужно добавить диспетчера сценариев на страницу, если она не существует.

+0

Спасибо. Есть ли способ работать с полями ввода? Я не могу использовать asp-поля (asp textbox и т. Д.), Потому что он отправляется на сервер, что создает риски безопасности для платежей. – SummerDays

+0

@SummerDays посмотрите на этот пример http://stackoverflow.com/questions/389149/how-to-access-html-form-input-from-asp-net-code-behind – MethodMan

+0

Спасибо! Получил это, чтобы работать. Также я добавил '', который требуется для UpdatePanel. – SummerDays

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