【问题标题】:RedirectToAction where the Controller is in an Area控制器位于区域中的 RedirectToAction
【发布时间】:2020-02-03 11:24:35
【问题描述】:

我开始使用 ASP.Net core MVC 3.1 并且有一个名为 Foo 的区域:

endpoints.MapAreaControllerRoute(
    name: "Foo",
    areaName: "Foo",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);

在这个区域中,一个名为 Test 的控制器带有一个 Index 操作:https://localhost:44390/Foo/Test/ - 这工作正常。

我正在尝试从另一个控制器重定向到此

return RedirectToAction("Index", "Test", new { area = "Foo" });

但这是将我发送到https://localhost:44390/Test?area=Foo

我如何使用RedirectToAction() 来结束https://localhost:44390/Foo/Test/

【问题讨论】:

  • 我能问一下area:exists应该在做什么吗,不应该只是{area}吗?
  • 其记录为 exists 应用了路由必须匹配区域的约束
  • 我认为你必须从路由模式中去掉area"{controller}/{action}/{id}"。然后return RedirectToAction("Index", "Test", new { Area = "Foo" }); 应该可以工作。
  • 尝试定义新的MapRoute 并使用RedirectToRoute 而不是RedirectToAction
  • 如果我删除 {area:exists} 则它可以工作(可能与控制器名称匹配)但它仍将区域显示为查询字符串,并且还允许 localhost:44390/Test

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


【解决方案1】:

MapAreaControllerRoute 放在默认路由之后时,我会重现您的问题。因此,要解决它,您的区域路由配置必须放在第一位。

 app.UseEndpoints(endpoints =>
        {
            endpoints.MapAreaControllerRoute(
               name: "Foo",
               areaName: "Foo",
               pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
           );
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");

        });

【讨论】:

    【解决方案2】:

    将这些属性放在测试控制器中。

    [Area(nameof(Foo))]
    [Route(nameof(Foo) + "/[controller]")]
    

    Sample Image

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案3】:

    您可以使用以下代码

    配置中设置路线:

    "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    

    然后

    public IActionResult Index()
    {
       return RedirectToAction("Index", "Test", new { area = "Foo" });
    }
    

    然后

    [Area("Foo")]
    [Route("[controller]")]
    public class TestController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    

    【讨论】:

      【解决方案4】:

      我认为你应该下面的代码:

      namespace Solution.Areas.ControlPanel.Controllers
      {
          [Area(nameof(Foo))]
          [Route(nameof(Foo) + "/[controller]")]
          public class HomeController : Controller
          {
              public IActionResult Index() => View();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 2023-03-12
        • 2019-06-19
        • 2011-02-08
        • 2017-12-23
        相关资源
        最近更新 更多