asp -контроллер и asp -акция не работает в ASP. NET Core 3.1 Razor Pages app - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть ASP. NET Core 3.1 Razor Pages, которое позволяет пользователям входить и выходить из системы.

Для выхода из системы у меня есть следующий контроллер:

public sealed class AccountController : Controller
{
    [Route("/Logout")]
    public async Task<IActionResult> LogoutAsync()
    {
        await this.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

        return this.RedirectToPage(ApplicationConstants.IndexPage);
    }
}

В _Layout.cshtml файле у меня есть следующее:

<a class="nav-link" asp-controller="Account" asp-action="LogoutAsync"><i class="fa fa-sign-out fa-lg" aria-hidden="true"></i></a>

В _ViewImports.cshtml файле, который находится в родительском каталоге _Layout.cshtml, у меня есть следующее:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

В Startup.cs файле я добавил следующее:

public void ConfigureServices(IServiceCollection services)
{
    // stuff

    services.AddControllers();

    services.AddRazorPages()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizePage("/Page1");
            options.Conventions.AuthorizePage("/Page2");
        });

    // more stuff
}

public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // stuff

    app.UseAuthentication();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapRazorPages();
    });
}

Кажется, Visual Studio доволен этой настройкой и распознает asp-controller и asp-action как ASP. NET Core Tag. Помощники.

Однако при запуске приложения ссылка отображается следующим образом (обратите внимание на пустое href):

<a class="nav-link" href=""><i class="fa fa-sign-out fa-lg" aria-hidden="true"></i></a>

Чего мне не хватает?

Примечания:

  • Я обновляю приложение с ASP. NET Core 2.2 до 3.1. Он работает с 2.2.
  • Да, я искал переполнение стека, погуглил проблему и не нашел решения.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Похоже, это известное и намеренное поведение, которое было введено в ASP. NET Core 3.0.

Если у метода действия есть суффикс Async, он будет проигнорирован; следовательно, asp-action не увидит LogoutAsync в качестве действующего действия.

Для справки см. эту документацию по переходу на ASP. NET Core 3.0 с 2.2 и это выпуск GitHub.

0 голосов
/ 27 апреля 2020

Насколько я знаю, если вы хотите, чтобы тег генерировал herf, вы должны установить шаблон маршрута в методе Configure.

Более подробно, вы можете обратиться к кодам ниже:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

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

            endpoints.MapRazorPages();
        });
    }

Результат:

enter image description here

...