Невозможно перенаправить другую страницу в ASP.NET Core MVC Project Controller - PullRequest
0 голосов
/ 04 января 2019

Я хотел бы нажать кнопку, чтобы подключить GET API, сделать что-то и перенаправить страницу.

    const Http = new XMLHttpRequest();
    Http.open("GET", '/Startup/Action/Test');
    Http.send();
    Http.onreadystatechange = (e) => {
        console.log(Http.responseText)
    }

Тогда в моем контроллере:

    [HttpGet("Startup/Action/{Handle}")]
    public IActionResult Action(string Handle)
    {
        this.ViewData["Result"] = Handle;

        return this.Ok(Handle);

        // return LocalRedirect("~/Startup/");
        // return Redirect("http://localhost:50429/");
        // return View("~/Views/Startup/Index.cshtml");
        // return Redirect("/");
        // return RedirectToAction("Index", "Startup");
    }

Я получаю ответ и вижу его в консоли, написанной событием javascript XMLHttpRequest. Однако я не могу перенаправить на другую страницу. Я попробовал все параметры, указанные выше, в качестве возвращаемого значения.

1 Ответ

0 голосов
/ 04 января 2019

С AJAX вы не выполняете перенаправление на стороне сервера, вы выполняете его на стороне клиента после получения результата. Примерно так:

Http.onreadystatechange = (e) => {
    if(xhr.readyState === 4 && xhr.status === 200) {
        window.location.href = '@Url.Action("Index", "Startup")';
    } else {
        // non-success reaponse?  do something else?
    }
}

Приведенный выше код перенаправляет после успешного ответа AJAX. Обратите внимание, что этот код JavaScript должен быть в самом представлении, чтобы использовать помощник Url.Action(). Если код JavaScript находится в отдельном файле, одним из вариантов может быть возврат в виде строки в ответе AJAX URL-адреса, на который вы перенаправляете.

Обратите внимание, что то, что вы делаете , немного отличается здесь:

this.ViewData["Result"] = Handle;

Я могу ошибаться, но я подозреваю, что не перенесет на перенаправление. TempData может ? Но в конечном итоге возникает вопрос ... Что именно вы пытаетесь достичь? Вы отправляете значение на сервер, а затем пытаетесь перенаправить пользователя на другую страницу, чтобы включить это значение. Итак, клиент уже знает это значение, и, поскольку это AJAX, клиенту необходимо выполнить перенаправление, поэтому вообще необходима эта операция AJAX?

Мне не совсем ясно, какова общая цель, и я подозреваю, что общая установка может быть значительно упрощена. Но похоже, что AJAX здесь нужен вообще. Вы можете вернуть свой серверный код для выполнения перенаправления и вместо использования AJAX просто перенаправить клиент на это серверное действие полностью:

window.location.href = '/Startup/Action/Test';

или

winfow.location.href = '@Url.Action("Action", "Startup", new { Handle = "Test" })';

А затем перенаправьте действия на стороне сервера, как вы изначально пытались:

[HttpGet("Startup/Action/{Handle}")]
public IActionResult Action(string Handle)
{
    this.ViewData["Result"] = Handle;
    return RedirectToAction("Index", "Startup");
}

Это все еще возможно, и снова я не уверен, что ViewData здесь не правильно, и вы можете использовать TempData при перенаправлении. Хотя, опять же, в равной степени вероятно, что все, что вы пытаетесь достичь, может быть сделано в первую очередь более эффективно. Например, пропустить этот метод действия Action полностью и просто передать значение Handle непосредственно в действие Index, независимо от того, что оно делает с этим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...