ASP. NET Core 2.2 MVC Проект MapRoute для ASP. NET 3.0 конечных точек MapAreaControllerRoute "Эта страница локального хоста не найдена" - PullRequest
1 голос
/ 16 февраля 2020

Мы обновляем наше приложение с ASP. NET Core 2.2 проекта до ASP. NET 3.0, который использует маршрутизацию EndPoint. Я застрял в следующей проблеме "Веб-страница не найдена". Я считаю, что я применил правильные изменения к 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?}");

Моя Страница бритвы включает следующее:

    <a asp-area="Navigation" asp-controller="NavigationHome" asp-action="IndexAsync">Navigation</a>

Я получаю следующую проблему, которая Я застрял на

enter image description here

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Решением этой проблемы было рассмотрение «Миграция с ASP. NET Core 2.2 до 3.0». Первоначально это было сделано, но предложение в этом документе было упущено.

Мой проект состоит из 130 других подпроекты. Чтобы решить мою проблему, я должен был сделать следующее:

  1. Просмотрите "Переход с ASP. NET Core 2.2 на 3.0" снова.

  2. Удалите все ссылки Core 2.2 на MapRoute при запуске. Например:

    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. И последний ключевой элемент, пока мы не исправим и не обновим наш код. «Asyn c удаление суффикса из имен действий контроллера»

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

    Это была маленькая деталь, которая была пропущена при запуске, как описано в «Перенос с ASP. NET Core от 2,2 до 3,0 "

  5. После внесения изменений приложение работает как задумано.

0 голосов
/ 13 марта 2020

Украсив свой контроллер Route attribure

[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?}");
});

//...

Это делается для того, чтобы избежать конфликтов маршрутов при сопоставлении запросов с зарегистрированными маршрутами.

При работе с маршрутизацией на основе соглашений порядок регистрации также влияет на то, как таблица маршрутизации интерпретирует запросы.

Поэтому убедитесь, что указанные c маршруты зарегистрированы перед более общими маршрутами. , Районы также должны быть зарегистрированы до общих маршрутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...