单击时不会调用带有提交按钮方法的ASP.NET Web表单中的Braintree Drop-In UI

时间:2015-04-27 12:38:24

标签: asp.net webforms braintree

我创建了一个简单的付款表单,其中包含接受金额的字段,插入式用户界面和提交按钮。

<form id="form1" runat="server">
<div>
  <label>Amount:</label>
  <asp:TextBox ID="txtAmount" runat="server" />
</div>
<div id="dropin-container"></div>
<asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit" />
<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
<script>
  braintree.setup("<%= this.ClientToken %>", "dropin", { container: "dropin-container" });
</script>

和背后的代码

protected string ClientToken = String.Empty;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        GenerateClientToken();
    }
}

protected void GenerateClientToken()
{
    var gateway = new BraintreeGateway
    {
        Environment = Braintree.Environment.SANDBOX,
        MerchantId = "merchant-id",
        PublicKey = "public-key",
        PrivateKey = "private-key"
    };

    this.ClientToken = gateway.ClientToken.generate();
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    var gateway = new BraintreeGateway
    {
        Environment = Braintree.Environment.SANDBOX,
        MerchantId = "merchant-id",
        PublicKey = "public-key",
        PrivateKey = "private-key"
    };

    var request = new TransactionRequest
    {
        Amount = Convert.ToDecimal(this.txtAmount.Text),
        PaymentMethodNonce = Request.Form["payment_method_nonce"]
    };

    Result<Transaction> result = gateway.Transaction.Sale(request);
}

在浏览器中加载页面后,我可以看到接受金额的表单以及接受信用卡和/或PayPal的插入式ui表单。

问题是,当我单击“提交”按钮时,方法btnSubmit_Click不会被调用。该页面看起来像是正确回发但我看不到btnSubmit_Click中的任何代码行被执行。

我按照此页面的说明操作: https://www.braintreepayments.com/features/drop-in

但我真的无法想到我想念的任何事情。

任何人都可以帮助我解决这个问题,我将非常感激。非常感谢你。

诺特

3 个答案:

答案 0 :(得分:3)

我在Braintree工作,可以帮助您解决这个问题。

当您在页面上加载Drop-in时,braintree.js正在做什么的一些背景:它监听表单提交,当它检测到表单提交时,它将中断表单提交,与Braintree通信以生成nonce,以及然后在定义时运行你的回调。发生的事情是您的.NET回发事件正在广播提交操作 - 与braintree.js首先中断的操作类型相同。

作为解决方法,您可以尝试将以下内容添加到Page_Load代码中:

ClientScript.GetPostBackEventReference(this, string.Empty);
ClientScript.RegisterClientScriptBlock(this.GetType(), "PayEvent","<script>function PayEvent() {document.getElementById('__EVENTTARGET').value = '"+ btnSubmit.ClientID +"'; }</script>" );
btnSubmit.Attributes.Add("onClick", "PayEvent()");

其中btnSubmit是按钮的ID。

这应该绕过提交中断并允许您的表单正确提交。此外,我们的custom integration替代方案不会出现此问题。

如果您有任何其他问题,请告诉我们。

答案 1 :(得分:0)

您只需要将您的交易请求代码放在一个方法中,然后在帖子上调用该子文件而不是页面加载。

这样,自动提交不会中断事情。

Protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) {
    GetClientToken();
} else {
    Pay();
}
}

protected void Pay() {        
    PaymentMethodNonce = Request.Form["payment_method_nonce"]        
    //Build request string etc.
}

答案 2 :(得分:-1)

布赖恩,

上面的解决方案是由PayPal支持提供给我的,但不幸的是,它并没有解决问题。

老实说,正是这种'倾听'(读:不可靠,'聪明的代码')来形成提交,当一个人试图将它集成到Web Forms / UpdatePanel页面时会导致所有问题 - 它真的不是'为WebForms / UpdatePanels设计,需要各种非常混乱的代码才能使其正常工作和同步。它几乎就好像它从未被设计用于除MVC或Java之外的任何东西!

如果我们可以在OnClientClick上附加一个JavaScript调用,可以通过托管在PayPal上的JavaScript模块同步调用BrainTree / PayPal来返回nonce,那么我们可以用它做一些事情。 。现在,Braintree / PayPal代码拦截了一个提交按钮(默认情况下,WebForms中的所有按钮都是'提交',这会导致问题)并异步触发一个调用来获取一个随机数,同时调用该按钮单击C#代码。最终结果是C#代码在Braintree / PayPal调用返回之前运行,您永远不能同步这两个。