在 Razor Pages 中,运行 没有 UI 的操作的推荐方法是什么

In Razor Pages, what is the recommended way to run an action with no UI

我想实现一种注销方法,该方法仅将用户注销并重定向到主页。 我将如何设置路由以及代码将进入控制器,还是我需要为此创建一个新页面?看起来很奇怪,因为它不需要 UI.

创建一个名为 GetSignOut() 的方法,然后添加一个按钮或一个 <a></a> 标签并将其添加到其属性 asp-route-handler="signout" 最后在你的 GetSignOut() 中做你的注销相关的事情,最后 return redirectToPage("pageName")

asp-page 指定登出方法所在的页面名称,asp-page-handler 属性与 asp-page 属性相辅相成。 asp-page-handler 生成提交给页面定义的每个处理程序方法的 URL。如下更改您的 _LoginPartial.cshtml :

@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
    <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
    <a class="nav-link text-dark" asp-page="/Index" asp-page-handler="SignOut">Logout</a>
</li>
}

首页的IndexModel,RedirectToPage参数结合当前页面的路径计算出目标页面的名称。

    public class IndexModel : PageModel
    {
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly ILogger<LogoutModel> _logger;

    public IndexModel(SignInManager<ApplicationUser> signInManager, ILogger<LogoutModel> logger)
    {
        _signInManager = signInManager;
        _logger = logger;
    }
    public void OnGet()
    {

    }

    public async Task<IActionResult> OnGetSignOut()
    {
        await _signInManager.SignOutAsync();
        _logger.LogInformation("User logged out.");

        return RedirectToPage("/Index");

    }
}

结果:

RedirectToPage参考:https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-3.0&tabs=visual-studio#url-generation-for-pages

有一个方法的original Razor Pages project template included an AccountController-Logout。理由是注销过程不需要 UI,因此当 Razor 页面背后的目的是生成 HTML 时,为它创建一个 Razor 页面似乎很奇怪。

如果将 Identity 搭建到现有项目中,您现在会得到一个 Logout.cshtml 文件,该文件将使用重定向到 return URL 如果提供,否则显示 "you have been logged out"。

因此,这两种方法都倾向于建议使用 Razor Pages 生成 HTML,并使用控制器生成非 HTML 相关服务。