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程序,只添加以上代码也会出现一样的问题。
去掉 [Route("Admin/[controller]/[action]")]
试试
去掉之后甚至连正常的都不正常了
@敲键听响: areaName: "areas"
改为 areaName: "admin"
试试
@敲键听响: 参考 How to use an Area in ASP.NET Core
@dudu:
这样是可行的,但是这样也会有个问题
就是每个Area都需要这样配置一次
无法像Mvc4那样一个配置适配所有Area
@敲键听响: 如果你的 area 是放在默认约定的路径,应该可以直接用 MapControllerRoute 搞定。
endpoints.MapControllerRoute(
name: "areas"
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}",
defaults: new { Area = "admin", Controller = "Home", Action = "Index" });
@dudu: 我还以为Area必须要用MapAreaControllerRoute...
原来可以直接用MapControllerRoute的...
受教了受教了...
@敲键听响: 你最后如何配置的,我这样配置还是不行
@零点-Angelo: 参考最后dudu的解决方法