Неправильная маршрутизация при смешивании контроллеров представления и API с одинаковой семантикой - PullRequest
0 голосов
/ 24 марта 2020

(код доступен на https://github.com/sbollaerts/MismatchRouting)

Я сталкиваюсь с поведением asp. net core 3 и не могу понять Причина: может, кто-нибудь объяснит это?

Короче говоря: у меня есть веб-приложение, смешивающее GUI и API для управления элементами. Моя ссылка «создать новый» связана с действием «Создать» (маршрут элементов / создать), маршрут перенаправляет на API (api / items / create).

Шаги для воспроизведения ошибки:

  1. Создание стандартного веб-приложения (MVC)
  2. Создание модели элемента
namespace MismatchRouting.Models
{
    public class Item
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Caption { get; set; }
    }
}

Импорт пакетов слепков (entityframeworkcore.Sqlite)

Создание приложенияDbContext

namespace MismatchRouting.Data
{
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Item> Items { get; set; }

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
    }
}
Создать строку подключения в настройках приложения. json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=database.db"
  }
}
Зарегистрировать контекст базы данных приложения в файле запуска
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
        services.AddControllersWithViews();
    }

Генерация миграций (Add-Migrations xxx или do tnet ef migrations add xxx) и создание базы данных (Update-Database, или tnet ef update базы данных?)

В папке «Views» «Добавить» -> «Новые элементы Scaffolded ...» -> «MVC Contoller с представлениями с использованием Entity Framework» для создания базового c пользовательского интерфейса для элементов

В папке «Controllers» создайте папку «Api»

В разделе «Controllers / Api», «Добавить» -> «Новые элементы лесов». .. "->" Контроллер API с действиями, использующими Entity Framework "

Протестируйте приложение и получите доступ к списку элементов (ie: https://localhost: 44382 / items ) - нажмите кнопку «создать»: все работает нормально!

Теперь в Controllers / Api / ItemsController.cs измените сигнатуру метода PostItem:

[HttpPost]
//public async Task<ActionResult<Item>> PostItem(Item item)
public async Task<ActionResult<Item>> CreateAsync(Item item)

Ошибка # 1 При нажатии на ссылку «Создать новый» новый URL теперь «https://localhost: 44382 / api / Items » вместо «https://localhost: 44382 / Items / Create"

Ошибка № 2 Когда y Если вручную go на «https://localhost: 44382 / Items / Create », кнопки теперь ссылаются на «[GET] / api / items» вместо «[POST] / items / create»

В качестве обходного пути, я могу изменить имя функции API, но я хотел оставить тот же semanti c.

Может кто-нибудь объяснить, что вызывает эту путаницу с механизмом маршрутизации?

Спасибо, Серж

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