在我的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评估,并视为匹配路由。然后,系统以某种方式选择了默认路由作为目标路由。使用我固定的“仪表板”模板,情况就不再如此。
答案 0 :(得分:0)
问题是您的默认路由。区域路线应为默认路线。它已经对该路径参数具有:exists
约束,因此它也适用于非区域路径。路由基础结构短路,因此将优先选择不带区域的默认路由。