首页 > 解决方案 > ASP.NET Core 3.1 MVC:路由不适用于区域

问题描述

我有 2 个问题,但它们都与一个关键概念有关:我需要向 Routing 添加什么来处理区域内的页面?

  1. Admin我在我的 ASP.NET Core 3.0 MVC 应用程序中创建了一个区域。我希望能够访问这样的页面:

    a) /Admin/    ...to show the Index page
    b) /Admin/aa  ... show the view "aa"
    c) /Admin/bb  ... show the view "bb"
    

    浏览器只返回一个空白页面。日志中没有显示错误或异常。我怀疑路由不正确。

  2. 我确实在Admin该区域内添加了一个新的脚手架项目(上述问题 1 中所述),并为Company. 选择模型和其他细节后,VS2019 脚手架生成了控制器和相应的视图(创建、删除、详细信息、编辑、索引)。但是我需要添加什么路由代码来容纳新生成的 URL Company

下面是 Startup.cs 中的路由代码:

app.UseEndpoints(endpoints =>
            {
                endpoints.MapAreaControllerRoute(
                    name: "AdminArea",
                    areaName: "Admin",
                    pattern: "Admin/{controller=Home}/{action=Index}/{id?}");

                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });

这是文件夹中的控制器\Areas\Admin\Controllers

namespace MyWebSite.Areas.Admin.Controllers
{
    [Area("Admin")]
    public class AdminController : Controller
    {
        private readonly ILogger _logger;

        public AdminController(ILogger<AdminController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            _logger.LogInformation("GET: Admin/Index/");
            return View();
        }

        public IActionResult aa()
        {
            _logger.LogInformation("GET: Admin/aa/");
            return View();
        }

        public IActionResult bb()
        {
            _logger.LogInformation("GET: Admin/bb/");
            return View();
        }
    }
}

标签: routesasp.net-core-mvc

解决方案


作为您的 startup.cs 中的模式设置:

模式:“管理员/{controller=Home}/{action=Index}/{id?}”);

这意味着您的路由 muststart with Admin(area name)后跟控制器名称和操作名称。

你当前 Admin 区域的控制器名称也是 Admin,所以如果你想看到对应的页面,你应该输入链接:

http://localhost:xxxx/Admin/Admin/
http://localhost:xxxx/Admin/Admin/aa
http://localhost:xxxx/Admin/Admin/bb

如果你想遵循你的理想路线,你需要这样设置:    

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

但这ignore your Area name只会显示http://localhost:xxxx/Controller/Action

如果您HomeController在 Admin 区域下创建另一个控制器,您的路径将变为:http://localhost:xxxx/Home/

这是测试结果:

在此处输入图像描述


推荐阅读