ASP .Net Core Routing - невозможно определить, почему GET с параметрами не может быть перенаправлен на - PullRequest
1 голос
/ 27 октября 2019

Я пытаюсь заставить работать простой параметр GET, однако он продолжает маршрутизацию к GET без параметров. Когда я удаляю GET без параметров, он просто не может найти его и дает мне 404.

Я пробовал разные варианты атрибутов маршрутизации и атрибутов HttpGet, но все безрезультатно. У меня такое ощущение, что я упускаю что-то простое здесь.

Контроллер

    [Route("api/[Controller]")]
    public class ModelController : Controller
    {
        private readonly IDataRepository _repository;
        private readonly ILogger<VehicleController> _logger;

        public ModelController(IDataRepository repository, ILogger<VehicleController> logger)
        {
            _repository = repository;
            _logger = logger;
        }

        [HttpGet]
        public IActionResult Get()
        {
            try
            {
                return Ok(_repository.GetAllModels());
            }
            catch (Exception ex)
            {
                _logger.LogError($"Failed to get models : {ex}");
                return BadRequest("Failed to get models");
            }
        }

        [HttpGet("{id:Guid}")]
        public IActionResult GetAllModelsById(Guid id)
        {
            try
            {
                return Ok(_repository.GetModelsByMaker(id));
            }
            catch (Exception ex)
            {
                _logger.LogError($"Failed to get models for maker : {ex}");
                return BadRequest("Failed to get models for maker");
            }
        }
    }

Запуск

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<DataContext>(cfg =>
            cfg.UseSqlServer(_config.GetConnectionString("WebAppConnectionString")));
            services.AddControllersWithViews();
            services.AddTransient<DataSeeder>();
            services.AddScoped<IDataRepository, DataRepository>();
            services.AddAutoMapper(Assembly.GetExecutingAssembly());
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });

            //app.UseEndpoints(x => x.MapControllers());
        }

1 Ответ

0 голосов
/ 27 октября 2019

В AspNetCore 3.0 мы можем использовать статическую и динамическую маршрутизацию. Динамическая маршрутизация, кажется, не в наших случаях

В статической маршрутизации мы можем выбрать 2 различных подхода.

Первый подход - это жестко запрограммированные маршруты с ручным вводом.

Например, если мы хотим показать нашу страницу about в начале приложения, мы должны использовать варианты маршрута, как в коде ниже в контроллере . Этот вариант маршрутов содержит http://localhost:5000 или http://localhost:5000/about,, все URL будут маршрутизироваться относительно действия индекса контроллера.

Похоже, что ваши настройки контроллера About настроены для использования чего-то вроде этого.

   [Route("")]
   [Route("About")]
   public IActionResult Index()
   {
      return View();
   }

Второй подход - централизованные маршруты при запуске

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

Что ж, это довольно просто, и вы должны увидеть, когда вы создадите новое приложение mvc для ядра asp.net.

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });

Отлично! мы говорим, используйте этот шаблон в URL

"{controller = Home} / {action = Index} / {id?}"

Позвольте мне объяснить вам;

  • Первое имя контроллера, которое по умолчанию является Home ({controller = Home}) *

  • И затем имя действия (/), значение которого по умолчаниюравно
    Index ({action = Index})

  • А затем (/) приходит идентификатор параметра, и это может быть
    null (необязательно) ({id?})

Значения по умолчанию означают, когда мы не пишем что-либо в URL, которое будет использовать приложение маршрута. В маршруте по умолчанию мы используем home / index url и route, этоозначает, что если мы нажмем только http://localhost:5000, мы получим действие home / index.

В этом случае ваша проблема должна быть решена, выберите один из этих подходов.

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