繁体   English   中英

在 ASP.NET Core 中缓存导航栏链接

[英]Caching navbar links in ASP.NET Core

我有一个 ASP.NET Core 应用程序,它根据用户的角色显示不同的导航栏链接。

它首先检查用户是否已登录。如果是,则从数据库中检索名称和角色。 然后使用角色上的 switch 语句呈现导航栏链接。 这是在我的_LoginPartial.cshtml 中,我包含在我的_Layout.cshtml 中

@inject SignInManager<AppUser> SignInManager
@inject UserManager<AppUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    string name = UserManager.Users
        .Where(u => u.Id == UserManager.GetUserId(User))
        .Select(u => u.AppUser.FirstName + " " + u.AppUser.LastName)
        .FirstOrDefault();

    var usr = await UserManager.GetUserAsync(User);
    string role = (await UserManager.GetRolesAsync(usr))
        .FirstOrDefault();

    <ul class="navbar-nav mr-auto mt-2 mt-lg-0 d-lg-flex justify-content-center flex-fill ">
        <li class="nav-item ">
            <a class="nav-link text-dark text-uppercase font-size-xlarge font-weight-light" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
        </li>
        @switch (role)
        {
            case "Student": 
                <li class="nav-item">
                   <a class="nav-link" asp-area="Exams" asp-controller="Schedules" asp-action="Index">Exams</a>
                </li>
                @* More student-specific links here *@
                break;

            case "Instructor":
                <li class="nav-item">
                   <a class="nav-link" asp-area="Programs" asp-controller="Programs" asp-action="Index">Programs</a>
               </li> 
                @* More instructor-specific links here *@
                break;

            case "Administrator":
                @* Admin-specific links here *@ 
                break;
        }
    </ul>
}    

我想缓存这些链接以避免每次为每个用户从数据库中获取用户的角色和名称。 由于此代码是布局文件的一部分,因此它对每个页面都执行。

如何使用缓存标签助手来缓存因角色而异的导航链接列表? 我试过这样的事情:

<cache vary-by="@role">
     <ul class="navbar-nav mr-auto mt-2 mt-lg-0 d-lg-flex justify-content-center flex-fill ">
            <li class="nav-item ">
                <a class="nav-link text-dark text-uppercase font-size-xlarge font-weight-light" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
            </li>
        @switch (role) {
        ...
    </ul>
</cache>

但是,我不太确定这是否提供任何性能优势,因为这不会阻止到数据库的往返读取用户的名称和角色。 是否有任何解决方法可以用来缓存这些因角色而异的导航栏链接? 我没有为我的应用程序使用任何分布式缓存服务。 或者这应该通过注入IMemoryCache来完成? 我错过了什么?

如果目标是减少对数据库的调用,我可以看到以下选项:

  1. 您需要将角色保存在某处 - 例如通过使用 Session。
  2. 或更改输出缓存以因用户而异:
<cache vary-by-user>
  1. 或使用声明而不是角色。 无需任何数据库查询即可从ClaimsPrincipal检索声明列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM