Маршрутизация атрибутов не работает должным образом в ядре asp.net 3.0

Я пытался перенести мое приложение с ядра 2.1 на 3.0 asp.net, которое использует маршрутизацию атрибутов.

Методы ConfigureServices и Configure моего файла запуска:

public void ConfigureServices(IServiceCollection services)
{
    services.ConfigureOptions(typeof(ABCClass));
    services.AddTransient<ITagHelperComponent, XYZTagHelperComponent>();            
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
    }
    app.UseStaticFiles();
    app.UseMvcWithDefaultRoute();
}

Я заменил services.AddMvc(); with services.AddMvc(options => options.EnableEndpointRouting = false); отключить маршрутизацию конечной точки

Мой метод действия:

[Route("")]
[Route("Machines")]
public async Task<ViewResult> GetMachinesAsync()
{
    return View("MachineView");
}

В первый раз мое приложение загружается с MachineView, но когда я пытаюсь вызвать тот же метод действия, он выдает ошибку 404 (страница не может быть найдена)

вызов действия из файла .cshtml:

<li class="nav-item">
    <a class="nav-link"
       href="@Url.Action("GetMachinesAsync", "Machine")">
       Machines 
    </a>
</li>

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

Заранее спасибо.

Всего 2 ответа


Асинхронный суффикс для имен действий контроллера будет урезан по умолчанию в asp.net core 3.0.

См. Https://stackoverflow.com/a/59024733/10158551.

Solution1:

Замените GetMachinesAsync на GetMachines в представлении.

<li class="nav-item">
 <a class="nav-link"
   href="@Url.Action("GetMachines", "Machine")">
   Machines 
</a>
</li>

Solution2:

Продолжайте использовать GetMachinesAsync

<li class="nav-item">
<a class="nav-link"
   href="@Url.Action("GetMachinesAsync", "Machine")">
   Machines 
</a>
</li>

затем отключите это поведение при запуске

services.AddMvc(options =>
{
     options.EnableEndpointRouting = false;
     options.SuppressAsyncSuffixInActionNames = false;
});

Вам не требуются async суффиксы для методов действия. Поэтому, если вы хотите сослаться на GetMachinesAsync вам нужно использовать GetMachines , например так.

<li class="nav-item">
    <a class="nav-link"
       href="@Url.Action("GetMachines", "Machine")">
       Machines 
    </a>
</li>

Есть идеи?

10000