无法重定向ASP.NET Core MVC项目控制器中的另一个页面



我想按下一个按钮来连接一个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不在服务器端执行重定向,而是在收到结果后在客户端执行重定向。类似这样的东西:

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操作,不管它用该值做什么。

最新更新