Javascript发布请求回调,从.NET MVC控制器重定向

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript发布请求回调,从.NET MVC控制器重定向相关的知识,希望对你有一定的参考价值。

我正在将PayPal结账与e-com解决方案集成,在PayPal成功创建PayPal订单/付款时,我执行一些服务器端处理,最终从我的控制器返回RedirectResult(付款失败或相应成功的URL),回到客户端/前端。

我在下面有以下代码,并期望它自动重定向,但没有重定向发生。

paypal.Buttons(
    createOrder: function (data, actions) 
        return actions.order.create(
            intent: "CAPTURE",
            purchase_units: [
                amount: 
                    value: '5.20',
                
            ]
        );
    ,
    onApprove: function (data, actions) 
        return actions.order.capture().then(function (details) 
            return fetch('/umbraco/surface/PayPalPayment/process', 
                method: 'post',
                redirect: 'follow',
                body: JSON.stringify(
                    OrderID: data.orderID,
                    PayerID: data.payerID,
                ),
                headers: 
                    'content-type': 'application/json'
                
            );
        ).catch(error=>console.log("Error capturing order!", error));
    
).render('#paypal-button-container');

如果我使用下面的代码明确重定向,则执行该操作。

onApprove: function (data, actions) 
        return actions.order.capture().then(function (details) 
            return fetch('/umbraco/surface/PayPalPayment/process', 
                method: 'post',
                redirect: 'follow',
                body: JSON.stringify(
                    OrderID: data.orderID,
                    PayerID: data.payerID,
                ),
                headers: 
                    'content-type': 'application/json'
                
            ).then(function ()  window.location.replace('https://www.google.co.uk') );
        ).catch(function (error) 
            console.log("Error capturing order!", error);
            window.location.replace('https://www.bbc.co.uk');
        );
    

基本上,我想知道为什么fetch重定向不遵循从我的控制器返回的重定向。控制器重定向以获得完整性:

return new RedirectResult("/checkout/thank-you") ;
答案

让我试着改写一下你的问题

您想知道为什么浏览器在您制作fetch后没有重定向 - 即使fetch api响应是RedirectResult

原因很简单,你在fetch提出了一个请求,这意味着你正在发出ajax请求(因此浏览器不会改变)

你将redirect设置为follow,这意味着在第一次请求之后(即从/umbraco/surface/PayPalPayment/process获得响应之后),它将跟随到网址/checkout/thank-you所以,你在then()得到的将是/checkout/thank-you的回应

总体而言,它确实遵循了响应,但可能不是您期望的方式(遵循ajax请求,而不是浏览器更改页面)

如果你想要的是重定向到特定页面,在成功调用/umbraco/surface/PayPalPayment/process之后

然后做:

  1. 修改你的后端以返回url的JsonResult而不是RedirectResult
return Json(new redirectUrl = "/checkout/thank-you");
  1. 使用then重定向
// other code omitted

.then(function (response)  return response.json(); )
.then(function (data) window.location.replace(data.redirectUrl));

以上是关于Javascript发布请求回调,从.NET MVC控制器重定向的主要内容,如果未能解决你的问题,请参考以下文章

从 Javascript 调用 JSONP Ajax 回调

Javascript MV framework 对比

javascript 跨域 的几种方法

无状态 REST 服务器上的 Google API 回调

如何从 javascript 调用 flash actionscript 回调方法?

asp.NET Jquery post请求回调函数的问题