【问题标题】:ASP.NET Core 2.2 MVC MapRoute project to ASP.NET 3.0 endpoints MapAreaControllerRoute "This localhost page can't be found"ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”
【发布时间】: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>

我遇到了以下问题

【问题讨论】:

    标签: c# asp.net-core-3.0 asp.net-core-routing


    【解决方案1】:

    对此的解决方案是查看“从 ASP.NET Core 2.2 迁移到 3.0”。最初已完成此操作,但忽略了本文档中的建议。

    我的项目包含 130 个其他子项目。为了解决我的问题,我做了以下事情:

    1. Review "Migrate from ASP.NET Core 2.2 to 3.0" again.

    2. 在 Startup 中删除所有 Core 2.2 对 MapRoute 的引用。例如:

      routes.MapRoute(name: "Navigation", template:     
                      Navigation/{controller}/{action}/{id?}";
      
    3. 使用来自"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?}");});
      
    4. 最后一个关键项目,直到我们修复和更新我们的代码。 “从控制器操作名称中删除异步后缀”

      services.AddMvc(options =>options.SuppressAsyncSuffixInActionNames = false);
      

      这是 "Migrate from ASP.NET Core 2.2 to 3.0" 中描述的 Startup 中遗漏的小细节

    5. 进行更改后,应用程序按预期工作。

    【讨论】:

      【解决方案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?}");
      });
      
      //...
      

      这样做是为了避免在将请求与已注册路由匹配时发生路由冲突。

      在处理基于约定的路由时,注册顺序也会影响路由表如何解释请求。

      因此,请确保在更一般的路线之前注册特定路线。区域也应该在一般路线之前注册。

      【讨论】:

      • 您的回答并没有完全解决我们的问题,但它帮助我们找到了解决方案。我会为此赏金给你。
      猜你喜欢
      • 2020-08-05
      • 2021-12-07
      • 2021-04-17
      • 2020-10-21
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多