【问题标题】:Cannot redirect another page in ASP.NET Core MVC project Controller无法在 ASP.NET Core MVC 项目控制器中重定向另一个页面
【发布时间】:2019-05-31 02:07:03
【问题描述】:

我想按下一个按钮来连接一个 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 事件编写的控制台中看到它。但是我不能重定向到另一个页面。我尝试了上面注释的所有选项作为返回值。

【问题讨论】:

  • 您不能在服务器端对ajax 请求进行重定向,但是您可以在onreadystatechange event 中发回重定向的url,然后使用javascript 重定向到通过设置window.location.href提供的url,请看这篇文章(stackoverflow.com/questions/43971141/…

标签: asp.net-core


【解决方案1】:

使用 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 动作,不管它用那个值做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多