Почему RedirectToAction после запроса Petch POST не возвращает новый View ()? - PullRequest
1 голос
/ 24 февраля 2020

Я использую Asp. Net Core 2.2

Я не понимаю, почему после вызова Fetch POST мой POST IActionResult не перенаправляет на другое действие и его представление ?

My Fetch in 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}`);
            });
    }

My POST Action:

[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));
        }

И метод, который просто должен возвращать новый View, но это не так :

[Authorize]
        public IActionResult TransactionCompleted()
        {

            return View();
        }

После выполнения вызова Fetch я получаю в консоли браузера:

XHR GET http://localhost: 53801 / User / TransactionCompleted [HTTP / 1.1 200 OK 724ms]

Как я понимаю, в моем RedirectToAction нет ничего плохого, так почему public IActionResult TransactionCompleted() не возвращает / перезагружает новый вид, просто я застрял в старом виде, где Fetch звонок был выполнен?

1 Ответ

0 голосов
/ 25 февраля 2020

После получения советов от Кристоф Лютьен Мне пришлось изменить действие моего контроллера POST, чтобы он возвращал URL:

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

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

И теперь мой вызов API Fetch принимает ответ от вызова POST на Checkout и использует его для перенаправления:

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}`);
            });
...