Javascript 为什么Fetch POST请求后的RedirectToAction不返回新视图()?

Javascript 为什么Fetch POST请求后的RedirectToAction不返回新视图()?,javascript,fetch,asp.net-core-2.2,Javascript,Fetch,Asp.net Core 2.2,我正在使用Asp.Net Core 2.2 我不明白为什么在Fetch POST调用之后,我的POST IActionResult没有重定向到另一个操作及其视图 我的取回JS: window.onload = function () { var requestToken = document.getElementsByName("__RequestVerificationToken")[0].value fetch('http://localhost:53801/

我正在使用Asp.Net Core 2.2

我不明白为什么在Fetch POST调用之后,我的POST IActionResult没有重定向到另一个操作及其视图

我的取回JS:

window.onload = function () {
        var requestToken = document.getElementsByName("__RequestVerificationToken")[0].value
        fetch('http://localhost:53801/User/Checkout', {
            method: 'post',
            headers: {
                "X-ANTI-FORGERY-TOKEN": requestToken,
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
            body: JSON.stringify({
                token: 'sometoken',
                payerID: 'someid',
                amount: price,
                users: usersQty,
                years: yearsQty
            })
        }).catch(function (err) {
            console.log(`error: ${err}`);
            });
    }
我的帖子:

[HttpPost]
        [Authorize]
        public async Task<IActionResult> Checkout([FromBody] TransactionCompletedModel transaction)
        {
            AppUser user = await _userManager.GetUserAsync(User);
            if (user != null)
            {
                if (user.PremiumExpiring == null || user.PremiumExpiring < DateTime.UtcNow)
                {
                    user.PremiumExpiring = DateTime.UtcNow.AddYears(1); //if not yet have full access
                }
                else
                {
                    user.PremiumExpiring = user.PremiumExpiring.AddYears(1); //if already have full access
                }

                await _userManager.UpdateAsync(user);
            }

            return RedirectToAction(nameof(TransactionCompleted));
        }
执行Fetch调用后,我在浏览器控制台中收到:

XHR GET[HTTP/1.1200OK 724ms]


据我所知,我的
重定向到操作
没有问题,所以为什么
public IActionResult TransactionCompleted()
不返回/重新加载新视图,只是我坚持使用旧视图,执行Fetch调用的位置?

在收到Christoph Lütjen的建议后,我不得不修改我的控制器POST操作以返回URL:

[HttpPost]
        [Authorize]
        public async Task<IActionResult> Checkout([FromBody] TransactionCompletedModel transaction)
        {
            //other rows without change

            return Ok("TransactionCompleted?token=" + transaction.Token);
        }

在收到Christoph Lütjen的建议后,我不得不修改控制器的POST操作以返回URL:

[HttpPost]
        [Authorize]
        public async Task<IActionResult> Checkout([FromBody] TransactionCompletedModel transaction)
        {
            //other rows without change

            return Ok("TransactionCompleted?token=" + transaction.Token);
        }

听起来好像您希望浏览器窗口重定向到TransactionCompleted?如果是。。。不,fetch()不是这样工作的。您必须在javascript中处理结果,并在客户端执行重定向。只有当您从浏览器的位置栏启动请求时,服务器端重定向操作才会起作用。您认为,如果我从
fetch().then()
JS函数调用fetch GET some
IActionResult
,它应该完成这项工作吗?或者,以另一种方式,我应该在Fetch调用后被重定向?您的js函数不会得到IActionResult,而是http头。重定向当前在fetch()函数中。在JavaScript中,您可以“重定向”,例如使用
location.href
。如果您不想硬编码url,请在响应f Checkout()操作时返回url。@ChristophLütjen我希望使用Fetch API获得更优雅的解决方案。无论如何,谢谢你,你阻止了我去理解怎么做。听起来好像你希望浏览器窗口被重定向到TransactionCompleted?如果是。。。不,fetch()不是这样工作的。您必须在javascript中处理结果,并在客户端执行重定向。只有当您从浏览器的位置栏启动请求时,服务器端重定向操作才会起作用。您认为,如果我从
fetch().then()
JS函数调用fetch GET some
IActionResult
,它应该完成这项工作吗?或者,以另一种方式,我应该在Fetch调用后被重定向?您的js函数不会得到IActionResult,而是http头。重定向当前在fetch()函数中。在JavaScript中,您可以“重定向”,例如使用
location.href
。如果您不想硬编码url,请在响应f Checkout()操作时返回url。@ChristophLütjen我希望使用Fetch API获得更优雅的解决方案。无论如何,谢谢你,你让我明白了怎么做。
var requestToken = document.getElementsByName("__RequestVerificationToken")[0].value
        fetch('http://localhost:53801/User/Checkout', {
            method: 'post',
            headers: {
                "X-ANTI-FORGERY-TOKEN": requestToken,
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
            body: JSON.stringify({
                token: 'sometoken',
                payerID: 'someid',
                amount: price,
                users: usersQty,
                years: yearsQty
            })
        })
            .then((response) => { return response.json(); })
            .then((result) => { window.location = result })
            .catch(function (err) {
            console.log(`error: ${err}`);
            });