form POST in ASP.NET page

2019-09-18 05:12发布

问题:

I am trying to implement a paypal payment in my .aspx page. I have the following html in my page:

<form target="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post">
  <input type="hidden" name="cmd" value="_xclick">
  <input type="hidden" name="hosted_button_id" value="19218">
  <input type="hidden" name="rm" value="2">
  <input type="hidden" name="business" value="<%= ConfigurationManager.AppSettings("BusinessEmail").ToString%>">
  <input type="hidden" name="item_name" value="<%= "CityBits Gold " & listplans.SelectedItem.ToString & " listing plan for " & trim(txttitle.text)%>">
  <input type="hidden" name="item_number" value="<%= HiddenFieldid.Value%>">
  <input type="hidden" name="amount" value="<%= listplans.SelectedValue%>">
  <input type="hidden" name="currency_code" value="EUR">
  <input type="hidden" name="return" value="<%= ConfigurationManager.AppSettings("ReturnUrl").ToString & "?requestID=" & HiddenFieldid.Value%>">
  <input type="hidden" name="cancel_return" value="<%= ConfigurationManager.AppSettings("CancelUrl").ToString%>">
  <input type="hidden" name="no_shipping" value="1">
  <input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_cart_LG.gif" border="0" name="submit" alt="">
  <img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

In my aspx page, when i click the paypal button, it just refresh the page. When I put the exact same code (with actual values of course) in a plain html file and click the button, it redirect me to paypal as desired. I have tried using actual values for inputs just like in the html page, but it still does not work.

if it matters, I have update panels in my page, but this form is not inside them.

Anyone knows what I am doing wrong? It might be something stupid, but this is giving me headaches for 2 days now!

回答1:

The problem here is the way ASP.NET pages work. ASP.NET always assumes only one large form on the page, and begins to perform various tricks when you introduce a second one.

However what you can use in your case is a Button control and its PostBackUrl property. It will handle your inner form correctly, gathering all parameters and performing a post:

<form target="paypal">
  ...
  <asp:ImageButton runat="server" ID="PayPalSubmit"
                   PostBackUrl="https://www.paypal.com/cgi-bin/webscr"
                   ImageUrl="https://www.sandbox.paypal.com/en_US/i/btn/btn_cart_LG.gif" />
</form>


回答2:

This is a well-known issue with ASP.NET forms when trying to post data to PayPal. Here's a really cool solution that I use all the time for E-Commerce Web Forms applications:

http://jerschneid.blogspot.com/2007/03/hide-form-tag-but-leave-content.html

And here are two personal blog posts expanding on Jeremy Schneider's idea of using a custom version of HtmlForm:

http://codersbarn.com/post/2008/03/08/Solution-to-ASPNET-Form-PayPal-Problem.aspx

http://codersbarn.com/post/2008/03/27/Integrate-PayPal-Checkout-Button-with-ASPNET-20.aspx

Stay away from using double form tags, JavaScript and other hacks.

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;

/// <summary>
/// This is a special form that can _not_ render the actual form tag, but always render the contents
/// </summary>
public class GhostForm : System.Web.UI.HtmlControls.HtmlForm
{
  protected bool _render;

  public bool RenderFormTag
  {
      get { return _render; }
      set { _render = value; }
  }

  public GhostForm()
  {
      //By default, show the form tag
      _render = true;
  }

  protected override void RenderBeginTag(HtmlTextWriter writer)
  {
      //Only render the tag when _render is set to true
      if (_render)
          base.RenderBeginTag(writer);
  }

  protected override void RenderEndTag(HtmlTextWriter writer)
  {
      //Only render the tag when _render is set to true
      if (_render)
          base.RenderEndTag(writer);
  }
}