(код доступен на https://github.com/sbollaerts/MismatchRouting)
Я сталкиваюсь с поведением asp. net core 3 и не могу понять Причина: может, кто-нибудь объяснит это?
Короче говоря: у меня есть веб-приложение, смешивающее GUI и API для управления элементами. Моя ссылка «создать новый» связана с действием «Создать» (маршрут элементов / создать), маршрут перенаправляет на API (api / items / create).
Шаги для воспроизведения ошибки:
- Создание стандартного веб-приложения (MVC)
- Создание модели элемента
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.
Может кто-нибудь объяснить, что вызывает эту путаницу с механизмом маршрутизации?
Спасибо, Серж