ASP.NET Core MVC RedirectToAction 不工作

Posted

技术标签:

【中文标题】ASP.NET Core MVC RedirectToAction 不工作【英文标题】:ASP.NET Core MVC RedirectToAction isn't working 【发布时间】:2021-06-17 07:48:30 【问题描述】:

我已经看到很多关于这个问题的问题,但没有一个能解决我的问题。

我的问题:我的重定向操作方法命中了我被重定向到的方法,但视图停留在同一页面上,它永远不会更改为重定向的页面。

来自我的Index.chstml,我正在创建一个局部视图。

从使用 AJAX 的部分视图中,我正在向我的控制器提交请求。 AJAX 代码如下

        $.ajax(
                method: 'POST',
                url: "/Home/SubmitTest",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify(arr),
                success: function (response) 
                
            );

我的控制器代码在这里。我正在从 AJAX 方法接收数据并执行一些工作。最后,我试图将用户重定向到另一种方法。

[HttpPost]
public IActionResult SubmitTest([FromBody] List<TestSubmitViewModel> data)

    // Rest of the code goes here
    return RedirectToAction(nameof(PipelineList));

我重定向到的方法如下。两种方法都在同一个控制器中。重定向后,我遇到了这种方法。但我的观点仍然停留在以前的网址中

https://localhost:44339/Home/Index

但它应该重定向到

https://localhost:44339/Home/PipelineList

代码:

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> PipelineList()

    List<PipelineViewModel> itemList = new List<PipelineViewModel>();
    /// my other code goes here             
    return View(itemList);

注意:当我直接从 UI 访问此操作方法时,我的 PipelineList() 工作正常。我在这里做错了什么,我该怎么做才能重定向到 URL?

我正在使用 .NET Core 5。

这是我来自StartUp.cs的路由信息​​:

app.UseEndpoints(endpoints =>
        
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "controller/action/id?",
                defaults: new  controller = "Home", action="SignIn");
        );

更新 谢谢大家指出我遇到的问题。 我需要使用 AJAX 从 UI 传递选定的值(来自 JS 创建的表)。

最后,我通过更改控制器和 AJAX 代码使其工作。

更新的控制器:

[HttpPost]
public async Task<JsonResult> SubmitTest([FromBody] 
     List<TestSubmitViewModel> data)

    try
    
        // my codes goes here
        return Json(new StatusCode = statusCode );
    
    catch (Exception)
    
         return Json(new StatusCode = 500 );
    
        

更新的 AJAX:

$.ajax(
        method: 'POST',
        url: "/Home/SubmitTest",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(arr),
        success: function (response) 
        if (response.statusCode == 200) 
                var url = "/GitLab/PipelineList";
                window.location.href = url;
             else 
                alert("error");
            
        
    );

我知道这可能不是最好的解决方案,但就目前而言,它确实有效。非常感谢@Sergey 和@Filipe

【问题讨论】:

由于您使用的是 Ajax,它不会重定向而是返回到 ajax。这也是人们使用 ajax 的原因之一。如果您想重定向到另一个页面,为什么不使用提交表单? 谢谢@Sergey,我会试试的,然后更新你。 另一种方法是改变你的 ajax 成功:function (response) window.location.href localhost:44339/Home/PipelineList 。但在这种情况下,您可能会丢失一些数据。 我同意谢尔盖的观点。在这种情况下,您真的不需要 Ajax。只需提交表单。 【参考方案1】:

正如@Sergey 所说,您为ajax 使用了错误的高级。当您想要更新部分页面而不是刷新整个页面以提高客户体验和页面加载速度时,通常会使用 Ajax。如果你想重定向到另一个页面并且没有其他特定原因,则不需要使用ajax。

您会发现 ajax 服务器已经返回正确的 302 重定向到客户端并重定向到新页面:

正确的做法是像这样直接重定向到新页面:

<form asp-action="SubmitTest" asp-controller="Home" method="post">
     @*Other input value you want to submit*@
    <input  type="submit" value="Click"/>
</form>

结果:

【讨论】:

以上是关于ASP.NET Core MVC RedirectToAction 不工作的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 中是不是有等价于 redirect_to :back

在 ASP.NET MVC 控制器中,如何让 Redirect(string URL) 方法不附加“#”?

Google OAuth 2.0 得到错误 400:redirect_uri_mismatch,ASP.net core 3.1

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

[MVC&Core]ASP.NET Core MVC 视图传值入门

ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程