首页 新闻 会员 周边

关于Core3的多Area路由问题

0
悬赏园豆:50 [已解决问题] 解决于 2020-03-19 10:33

https://www.cnblogs.com/lonelyxmas/p/10934388.html
我参考这个写了个包含Area的asp.net core 程序(Core版本3.1.1/3.1.2)
Startup的核心代码如下

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.Use((context, next) =>
        {
            var route = context.GetRouteData();
            var endpoint = context.GetEndpoint();//拿到终结点                
            var routeData = context.Request.RouteValues;//拿到路由数据
            Console.WriteLine("=======");

            Console.WriteLine("route:" + route.ToJson());
            Console.WriteLine("endpoint:" + endpoint?.DisplayName);
            Console.WriteLine("routeData:" + routeData.ToJson());                             //做些牛B的事
            return next();
        });
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapAreaControllerRoute(
                name: "areas",
                areaName: "areas",
                pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}",
                defaults: new { Area = "admin", Controller = "Home", Action = "Index" });
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Area下的HomeController代码如下

[Area("Admin")]
[Route("Admin/[controller]/[action]")]
public class HomeController : Controller
{
    public IActionResult Index(string id)
    {
        return Json($"Index Id:{id}");
    }
}

但是很奇怪的是当我访问完整地址(比如 http://localhost:5000/admin/home/index
一切正常
当我不带Controller和Action访问网址访问(比如http://localhost:5000/admin 或者http://localhost:5000/admin/home)
会报404,endpoint为空
当我用直接用参数访问网址(比如 http://localhost:5000/admin/home/index?id=1000
一切正常
当我用路由模式带参数访问网址(比如 http://localhost:5000/admin/home/index/1000
会报404,endpoint为空
代码运行结果如下图:

我想请教一下这个是我哪里搞错了,或者有什么方法可以做到以前Mvc4那样的路由效果

备注:我特意新建了一个Web程序,只添加以上代码也会出现一样的问题。

敲键听响的主页 敲键听响 | 初学一级 | 园豆:116
提问于:2020-03-19 09:39
< >
分享
最佳答案
0

去掉 [Route("Admin/[controller]/[action]")] 试试

收获园豆:50
dudu | 高人七级 |园豆:31003 | 2020-03-19 09:58

去掉之后甚至连正常的都不正常了

敲键听响 | 园豆:116 (初学一级) | 2020-03-19 09:59

@敲键听响: areaName: "areas" 改为 areaName: "admin" 试试

dudu | 园豆:31003 (高人七级) | 2020-03-19 10:07

@敲键听响: 参考 How to use an Area in ASP.NET Core

dudu | 园豆:31003 (高人七级) | 2020-03-19 10:08

@dudu:
这样是可行的,但是这样也会有个问题
就是每个Area都需要这样配置一次
无法像Mvc4那样一个配置适配所有Area

敲键听响 | 园豆:116 (初学一级) | 2020-03-19 10:27

@敲键听响: 如果你的 area 是放在默认约定的路径,应该可以直接用 MapControllerRoute 搞定。

endpoints.MapControllerRoute(
                name: "areas"
                pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}",
                defaults: new { Area = "admin", Controller = "Home", Action = "Index" });
dudu | 园豆:31003 (高人七级) | 2020-03-19 11:08

@dudu: 我还以为Area必须要用MapAreaControllerRoute...
原来可以直接用MapControllerRoute的...
受教了受教了...

敲键听响 | 园豆:116 (初学一级) | 2020-03-19 11:12

@敲键听响: 你最后如何配置的,我这样配置还是不行

零点-Angelo | 园豆:200 (初学一级) | 2020-09-24 11:45

@零点-Angelo: 参考最后dudu的解决方法

敲键听响 | 园豆:116 (初学一级) | 2020-09-25 19:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册