将区域与RedirectToAction结合使用会导致无限循环的重定向

时间:2019-06-13 14:58:38

标签: c# asp.net-core-mvc

在我的ASP.NET Core MVC 2.2项目中,我使用区域来促进类,视图等的更好结构。但是,当通过RedirectToAction从一个控制器重定向到另一个控制器时,我面临以下问题。

我有一个名为“仪表板”的区域,一个名为DefaultDashboardController的控制器和一个HomeController。 DefaultDashboardController是仪表板区域的一部分。没有为HomeController分配区域。

在DefaultDashboardController中,有一个Index方法仅返回一个视图。

现在我要做的是将主控制器的Index方法重定向到DefaultDashboardController的Index方法。

我的HomeCntroller如下所示:

public class HomeController 
{
    [HttpGet]
    public IActionResult Index()
    {
        return RedirectToAction("Index", "DefaultDashboard", new { Area = "Dashboard"});
    }
 }

我的DefaultDashboardController看起来像这样:

[Area("Dashboard")]
public class DefaultDashboardController 
{
    [HttpGet]
    public IActionResult Index()
    {
        return View();
    }
 }

我的路由配置是在Startup类中设置的:

app.UseMvc(routes =>
    {
        routes.MapAreaRoute(
          name: "AreaDashboard",
          areaName: "Dashboard",
          template: "{area:exists}/{controller=DefaultDashboard}/{action=Index}/{id?}"
        );


        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}"
        );
    });

现在,当我调用HomeController的Index方法时,总是总是再次重定向到相同的方法(Home / Index)(导致获取/重定向请求的无休止循环)。

我能够解决此问题的唯一方法是在RedirectToAction调用中添加一个id参数:

return RedirectToAction("Index", "DefaultDashboard", new { Area = "Dashboard", id=1});

但是,这对我来说是一个非常丑陋且麻烦的解决方法。

RedirectToAction真的只能以这种方式工作吗? 还是我想如何利用MVC Core的Area功能有任何根本性的问题?

更新

即使我仍然不是100%知道为什么我的初始路线会引起短路,我还是提出了以下可行的解决方案:

app.UseMvc(routes =>
    {
        routes.MapAreaRoute(
          name: "AreaDashboard",
          areaName: "Dashboard",
          template: "Dashboard/{controller=DefaultDashboard}/{action=Index}/{id?}"
        );


        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}"
        );
    });

如您所见,我已将“仪表板”路径直接添加到MapAreaRoute模板。 我的假设是{area:exists}和默认路由均由MVC Core评估,并视为匹配路由。然后,系统以某种方式选择了默认路由作为目标路由。使用我固定的“仪表板”模板,情况就不再如此。

1 个答案:

答案 0 :(得分:0)

问题是您的默认路由。区域路线应为默认路线。它已经对该路径参数具有:exists约束,因此它也适用于非区域路径。路由基础结构短路,因此将优先选择不带区域的默认路由。