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