ASP.NET Core 2默认路由具有区域

5

我阅读了许多关于区域路由的帖子,但仍然无法解决我的问题。

我想将我的应用程序分成两个路由:

  • /Areas/Panel
  • /Areas/Website

每个区域内都有 HomeController 和相应的方法来对应操作。

我希望无论用户登陆到哪个一级路由:

  • /home
  • /contact
  • /about/company
  • 等等

都重定向到 /Areas/Website/{controller}/{action}

或者对于以下路由:

  • /panel
  • /panel/home
  • /panel/users/2
  • 等等

重定向到 /Areas/Panel/{controller}/{action}

我的当前 MVC 路由为:

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

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

但是它没有起作用,可能是因为我不完全理解如何告诉路由器使用Website区域作为默认值。我在控制器之前尝试了各种指令,但没有起作用。

我能请教一下你的建议吗?

提前感谢你。

1个回答

13

它无法正常工作的一个原因是你注册了错误顺序的路由。路由从路由表的顶部到底部进行评估,第一个匹配成功获胜。

另一个问题是,如果你希望“默认”路由将请求导向Website区域,则需要将其变成区域路由(使用MapAreaRoute扩展方法)。

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

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

参考: 为什么在ASP.NET MVC中要先映射特殊路由而不是普通路由?


抱歉,没有运气。我尝试了另一种方式。当我访问/Website/Home时它可以工作,但是当我收到错误:InvalidOperationException: The view 'Index' was not found. The following locations were searched: /Views/Home/Index.cshtml /Views/Shared/Index.cshtml。这很有道理,因为所需的视图不直接在项目中,而是在Website/Views中。我考虑过像template: "Areas/Website/{controller=Home}/{action=Index}/{id?}")这样的东西,但这也不起作用。 - Greg Wozniak
谢谢。我认为关键点在于areaName,因为这似乎是我所缺少的,但不幸的是,我遇到了一个错误:Error CS1739 The best overload for 'MapRoute' does not have a parameter named 'areaName'。所以问题似乎是如何指向default声明的正确区域... - Greg Wozniak
MapRoute 更改为 MapAreaRoute(请参见我的答案)。 - NightOwl888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接