ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”
Posted
技术标签:
【中文标题】ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”【英文标题】:ASP.NET Core 2.2 MVC MapRoute project to ASP.NET 3.0 endpoints MapAreaControllerRoute "This localhost page can't be found" 【发布时间】:2020-05-31 15:31:42 【问题描述】:我们正在将我们的应用程序从 ASP.NET Core 2.2 项目升级到使用端点路由的 ASP.NET 3.0。我被困在“未找到网页”的以下问题上。我相信我对 ASP.NET 3.0 应用了正确的更改,并且我尝试了各种更改。
这里是 asp.net core 2.2 代码区
startup.cs
public void ConfigureServices(IServiceCollection services)
......
//Asp.net Core 2.2
services.AddRouting();
//AddMvc
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
.AddViewLocalization(
LanguageViewLocationExpanderFormat.Suffix, options => options.ResourcesPath = "Areas\\Resources"; )
.AddDataAnnotationsLocalization();
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
.....
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "controller=Home/action=Index/id?");
//
routes.MapRoute(name: "Navigation", template: "Navigation/controller/action/id?";
我们用 :
装饰我们的控制器 namespace Areas.Navigation.Controllers
[Area("Navigation")]
[Route("[area]/[controller]/[action]")]
public class NavigationHomeController : Controller
.......
这是我们更改的 asp.net 3.0 代码区域
startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseEndpoints(endpoints =>
endpoints.MapControllerRoute(
name: "default",
pattern: "controller=Home/action=Index/id?");
//Endpoints Start
endpoints.MapAreaControllerRoute(areaName: "Navigation", name: "Navigation", pattern: "Navigation/controller/action/id?");
我的 Razor 页面包括以下内容:
<a asp-area="Navigation" asp-controller="NavigationHome" asp-action="IndexAsync">Navigation</a>
我遇到了以下问题
【问题讨论】:
【参考方案1】:对此的解决方案是查看“从 ASP.NET Core 2.2 迁移到 3.0”。最初已完成此操作,但忽略了本文档中的建议。
我的项目包含 130 个其他子项目。为了解决我的问题,我做了以下事情:
Review "Migrate from ASP.NET Core 2.2 to 3.0" again.
在 Startup 中删除所有 Core 2.2 对 MapRoute 的引用。例如:
routes.MapRoute(name: "Navigation", template:
Navigation/controller/action/id?";
使用来自"How to define an endpoint Route to multiple Areas"的建议 在 Startup 中,代码如下所示:
app.UseEndpoints(endpoints =>
endpoints.MapAreaControllerRoute(
name: "areas",
areaName: "areas",
pattern: "area/controller/action/id?"
);
endpoints.MapControllerRoute(
name: "default",
pattern: "controller=Home/action=Index/id?"););
最后一个关键项目,直到我们修复和更新我们的代码。 “从控制器操作名称中删除异步后缀”
services.AddMvc(options =>options.SuppressAsyncSuffixInActionNames = false);
这是 "Migrate from ASP.NET Core 2.2 to 3.0" 中描述的 Startup 中遗漏的小细节
进行更改后,应用程序按预期工作。
【讨论】:
【参考方案2】:通过使用Route
属性装饰您的控制器
[Area("Navigation")]
[Route("[area]/[controller]/[action]")] //<-- attribute routing
public class NavigationHomeController : Controller
//...
控制器现在使用属性路由,而不是基于约定的路由。
但是,您没有在配置中启用属性路由。
在以下示例中:
MapControllers
增加了对属性路由控制器的支持。MapAreaControllerRoute
为区域内的控制器添加常规路线。MapControllerRoute
为控制器添加了常规路由。
//...
app.UseEndpoints(endpoints =>
//Attribute routing
endpoints.MapControllers();
//Area convention-based routing
endpoints.MapAreaControllerRoute(
areaName: "Navigation",
name: "Navigation",
pattern: "Navigation/controller/action/id?");
//Convention-based routing
endpoints.MapControllerRoute(
name: "default",
pattern: "controller=Home/action=Index/id?");
);
//...
这样做是为了避免在将请求与已注册路由匹配时发生路由冲突。
在处理基于约定的路由时,注册顺序也会影响路由表如何解释请求。
因此,请确保在更一般的路线之前注册特定路线。区域也应该在一般路线之前注册。
【讨论】:
您的回答并没有完全解决我们的问题,但它帮助我们找到了解决方案。我会为此赏金给你。以上是关于ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Angular 9 SPA 项目和 ASP.NET Core 2.2 MVC 项目组合成一个 Visual Studio 2017 解决方案?
如何在启用 ASP.NET Core 2.2 EndpointRouting 的情况下使用 RouteDataRequestCultureProvider?