簡體   English   中英

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"

我們正在將我們的應用程序從 ASP.NET Core 2.2 項目升級到使用 EndPoint 路由的 ASP.NET 3.0。 我被困在“未找到網頁”的以下問題上。 我相信我對 ASP.NET 3.0 應用了正確的更改,並且我嘗試了各種更改。

這是asp.net core 2.2代碼區

啟動文件


        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 代碼區域

啟動文件

        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>

我遇到了以下問題

在此處輸入圖片說明

對此的解決方案是查看“從 ASP.NET Core 2.2 遷移到 3.0” 這最初已完成,但忽略了本文檔中的建議。

我的項目由 130 個其他子項目組成。 為了解決我的問題,我執行了以下操作:

  1. 再次查看“從 ASP.NET Core 2.2 遷移到 3.0”。

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

     routes.MapRoute(name: "Navigation", template: Navigation/{controller}/{action}/{id?}";
  3. 使用“如何定義到多個區域的端點路由”中的建議
    在啟動中,代碼如下所示:

     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);

    這是啟動中遺漏的小細節,如“從 ASP.NET Core 2.2 遷移到 3.0”中所述

  5. 進行更改后,應用程序按預期工作。

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

//...

這樣做是為了在將請求與注冊路由匹配時避免路由沖突。

在處理基於約定的路由時,注冊順序也會影響路由表如何解釋請求。

因此,請確保在更一般的路由之前注冊特定的路由。 區域也應該在一般路線之前注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM