MVC6中的区域路由中断

时间:2015-11-21 03:23:47

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

在以前的ASP.NET版本中,使用MVC 5,我可以在我的AreaRegistraion中设置这样的路由:

context.MapRoute(
    "pfrecent",
    "Forums/Recent/{page}",
    new { controller = ForumController.Name, action = "Recent", page = 1 },
    new[] { "PopForums.Controllers" });

这会将/Forums/Recent路由到论坛控制器及其最近的操作。但是,我无法弄清楚如何在ASP.Net 5 / MVC 6中使用它。我已将[Area("Forums")]添加到控制器类,并使用Startup类中的此路由:

routes.MapRoute(
    "pfrecent",
    "Forums/Recent/{page}",
    new { controller = ForumController.Name, action = "Recent", page = 1 });
routes.MapRoute(
    name: "areaRoute",
    template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

但是,它会解析为/Forums/Forum/Recent?page=1。目的是继续使用/Forums/Recent

4 个答案:

答案 0 :(得分:4)

我们正在使用它来启用MVC 6中的区域:

        // Configure MVC routing
        app.UseMvc(routes =>
        {
            // Areas support
            routes.MapRoute(
                name: "areaRoute",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

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

第一条路线是区域,第二条路线是主要内容。

答案 1 :(得分:4)

On Startup.cs

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

            routes.MapRoute(
                name: "Business",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
        })
控制器上的

[Area("Business")]
public class DemoController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

答案 2 :(得分:0)

将它放在路线列表顶部的Startup.cs文件中:

routes.MapRoute(
                name: "forumsAreaRoute",
                template: "Forums/{action}/{page?}",
                defaults: new {area = "Forums", controller = "Forum", action = "Recent", page = 1});

您的论坛控制器应如下所示:

[Area("Forums")]
public class ForumController : Controller
{
    // GET: /<controller>/
    public IActionResult Recent(int? page)
    {
        // Do action stuff here
    }
}

此解决方案将满足http://somedomain.com/Forums/Recent/1的网址并返回第一页。

答案 3 :(得分:0)

我讨厌回答我自己的问题,但回过头来看看来源和实验,我发现你必须在路线映射中指定区域,以及HtmlHelpers(我假设...对于标记帮助程序也是如此,但我还没有在转换中走得那么远。)所以路由映射必须如下所示:

routes.MapRoute(
    "pfrecent",
    "Forums/Recent/{page?}",
    new { controller = ForumController.Name, action = "Recent", page = 1, Area = "Forums" }
);

重要的部分是路由值对象中的Area属性。 HtmlHelper必须看起来像这样,也命名为Area:

@Html.ActionLink(PopForums.Resources.Recent, "Recent", ForumController.Name, new { page = 1, Area = "Forums" }, null)

它会使最近页面的网址符合预期/Forums/Recent。我可以告诉您,在MVC5中的派生AreaRegistration类中设置路由会为您设置路径上的区域值。在您的控制器类(我已经拥有)上使用[Area("Forums")]似乎假设以前的区域注册角色。