到ASP.NET 3.0端点的ASP.NET Core 2.2 MVC MapRoute项目MapAreaControllerRoute“找不到此本地主机页面”

时间:2020-02-16 15:14:57

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

我们正在将应用程序从ASP.NET Core 2.2项目升级到使用EndPoint路由的ASP.NET 3.0。我陷入了以下“找不到网页”的问题。我相信我对ASP.NET 3.0应用了正确的更改,并且尝试了各种更改。

这是asp.net核心2.2代码区域

startup.cs

greater

我们用:装饰控制器

static inline int greater(int a, int b) { return a > b ? a : b; }

这是我们已更改的 asp.net 3.0代码区域

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
       {.......

我遇到了以下问题

enter image description here

2 个答案:

答案 0 :(得分:1)

此问题的解决方案是审查“从ASP.NET Core 2.2迁移到3.0”,最初是这样做的,但是忽略了本文档中的建议。

我的项目包含130个其他子项目。要解决我的问题,我需要执行以下操作:

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

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

    routes.MapRoute(name: "Navigation", template:     
                    Navigation/{controller}/{action}/{id?}";
    
  3. 使用"How to define an endpoint Route to multiple Areas"的建议
    在启动中,代码如下所示:

        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"

  5. 中所述的启动中遗漏的小细节。
  6. 进行更改后,应用程序将按预期工作。

答案 1 :(得分:0)

通过使用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?}");
});

//...

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

在处理基于约定的路由时,注册顺序还对路由表如何解释请求起作用。

因此,请确保先注册特定路由,然后再注册更通用的路由。区域也应该在一般路线之前注册。