Javascript 为什么Fetch POST请求后的RedirectToAction不返回新视图()?
我正在使用Asp.Net Core 2.2 我不明白为什么在Fetch POST调用之后,我的POST IActionResult没有重定向到另一个操作及其视图 我的取回JS: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/
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 someIActionResult
,它应该完成这项工作吗?或者,以另一种方式,我应该在Fetch调用后被重定向?您的js函数不会得到IActionResult,而是http头。重定向当前在fetch()函数中。在JavaScript中,您可以“重定向”,例如使用location.href
。如果您不想硬编码url,请在响应f Checkout()操作时返回url。@ChristophLütjen我希望使用Fetch API获得更优雅的解决方案。无论如何,谢谢你,你阻止了我去理解怎么做。听起来好像你希望浏览器窗口被重定向到TransactionCompleted?如果是。。。不,fetch()不是这样工作的。您必须在javascript中处理结果,并在客户端执行重定向。只有当您从浏览器的位置栏启动请求时,服务器端重定向操作才会起作用。您认为,如果我从fetch().then()
JS函数调用fetch GET someIActionResult
,它应该完成这项工作吗?或者,以另一种方式,我应该在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}`);
});