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

     2023-02-15     194

关键词:

【中文标题】在 ASP.NET Core 中缓存导航栏链接【英文标题】:Caching navbar links in ASP.NET Core 【发布时间】:2021-12-09 06:02:15 【问题描述】:

我有一个 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】:

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

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

【讨论】:

如何在 ASP.Net Core MVC 中使用 HTML 链接?

...MVC中创建一个网站。在我的布局页面中,我正在制作一个导航栏来访问可以通过我的控制器访问的所有操作。但是我无法创建有用的链接。<ul><li><ahref="homepa 查看详情

在 ASP.Net Core Web 应用程序(引导程序)中向导航栏添加下拉菜单

】在ASP.NetCoreWeb应用程序(引导程序)中向导航栏添加下拉菜单【英文标题】:AddingaDropdownmenutotheNavBarinanASP.NetCoreWebApp(bootstrap)【发布时间】:2021-11-2217:15:38【问题描述】:在VisualStudio中,我创建了一个新的ASP.NetCoreWebApp然后我添... 查看详情

ASP.NET MVC C# 如何分隔导航栏链接?

】ASP.NETMVCC#如何分隔导航栏链接?【英文标题】:ASP.NETMVCC#HowToSeparateNavigationBarLinks?【发布时间】:2021-11-0311:55:33【问题描述】:我有一个带有MVC的C#ASP.NETCore项目。目前我已经添加了4个用户可以上传文件的类别,它们的类别显... 查看详情

Asp.Net Core:在控制器外使用内存缓存

】Asp.NetCore:在控制器外使用内存缓存【英文标题】:Asp.NetCore:Usememorycacheoutsidecontroller【发布时间】:2017-06-2207:40:45【问题描述】:在ASP.NETCore中,从控制器访问内存缓存非常容易在您的启动中添加:publicvoidConfigureServices(IServiceC... 查看详情

我是不是需要在 ASP.NET Core 中调用 AddMemoryCache 才能使缓存工作?

】我是不是需要在ASP.NETCore中调用AddMemoryCache才能使缓存工作?【英文标题】:DoINeedtoCallAddMemoryCacheinASP.NETCoreforCachetowork?我是否需要在ASP.NETCore中调用AddMemoryCache才能使缓存工作?【发布时间】:2017-06-1206:24:19【问题描述】:在最... 查看详情

如何在 ASP.NET core rc2 中禁用浏览器缓存?

】如何在ASP.NETcorerc2中禁用浏览器缓存?【英文标题】:HowtodisablebrowsercacheinASP.NETcorerc2?【发布时间】:2016-07-0618:56:12【问题描述】:我尝试了这个中间件,但浏览器仍在保存文件。我希望用户始终获得最新版本的js和css文件。pub... 查看详情

如何在 ASP.NET Core(.NET 6、VS 2022)中禁用浏览器链接

】如何在ASP.NETCore(.NET6、VS2022)中禁用浏览器链接【英文标题】:HowtodisableBrowserLinkinASP.NETCore(.NET6,VS2022)【发布时间】:2021-12-2508:42:30【问题描述】:我已禁用VisualStudio2022中的浏览器链接,并且我还禁用了所有热重载功能。即... 查看详情

ASP.NET Core 2 - 多个 Azure Redis 缓存服务 DI

】ASP.NETCore2-多个AzureRedis缓存服务DI【英文标题】:ASP.NETCore2-MultipleAzureRedisCacheservicesDI【发布时间】:2017-10-1811:21:48【问题描述】:在ASP.NETCore2中,我们可以像这样添加AzureRedis缓存:services.AddDistributedRedisCache(config=>config.Configur... 查看详情

ASP.NET Core 中的 Redis 缓存

】ASP.NETCore中的Redis缓存【英文标题】:RedisCacheinASP.NETCore【发布时间】:2017-03-1501:04:11【问题描述】:我是Redis新手,使用VS2015和ASP.NETCore应用程序(v1.0),我安装了nugget包:Install-PackageStackExchange.Redis但是我无法将其注入和配置到... 查看详情

在导航栏折叠时隐藏的导航栏中显示图像

】在导航栏折叠时隐藏的导航栏中显示图像【英文标题】:Displayanimageinthenavbarwhichishiddenwhennavbariscollapsed【发布时间】:2015-01-2623:32:50【问题描述】:我对Web开发非常陌生。我正在使用基于VisualStudio2013模板的ASP.Net构建一个页面... 查看详情

ASP .NET Core 身份登录管理器

...的帐户控制器中返回成功。在部分视图中,Login\\Register的链接添加了注入和库(根据其实现 查看详情

(asp.net) Bootstrap 4 导航栏切换器不工作

】(asp.net)Bootstrap4导航栏切换器不工作【英文标题】:(asp.net)Bootstrap4Navbartogglernotworking【发布时间】:2019-12-2020:49:40【问题描述】:我在asp.net(.net框架)中使用bootstrap4。当我将网站视图从pc视图更改为移动视图时,navbar-toggler-ico... 查看详情

在 IIS 中托管 ASP Net Core 应用程序时无限页面加载

...的dnx451框架上安装了两个ASP.NETCore网站。当我在浏览器中导航到它们时, 查看详情

在 ASP.Net Core Razor 页面中添加 Toast

...目成功添加到购物车时将toast添加到屏幕上,这是AddtoCart链接上的点击事件。我添加了逻辑,但没有按预期工作。我关注了link,下面是我试图 查看详情

ASP.NET Core 2.1:在 HTTP POST 验证失败后导航回页面显示浏览器错误

】ASP.NETCore2.1:在HTTPPOST验证失败后导航回页面显示浏览器错误【英文标题】:ASP.NETCore2.1:NavigatingbacktoapageafteranHTTPPOSTfailsvalidationdisplaysabrowsererror【发布时间】:2018-07-1217:50:07【问题描述】:问题:使用ASP.NETCore2.1MVC项目,我在使... 查看详情

在 ASP.NET Core 中呈现 RDLC 报告时出现索引超出范围异常

...是AspNetCore.Reporting库。此库适用于单个报告,但由于一些缓存问题,它会在生 查看详情

ASP.Net Core 2.0 - ResponseCaching 中间件 - 不在服务器上缓存

】ASP.NetCore2.0-ResponseCaching中间件-不在服务器上缓存【英文标题】:ASP.NetCore2.0-ResponseCachingMiddleware-NotCachingonServer【发布时间】:2018-06-2207:24:14【问题描述】:我想在asp.netcore2.0中使用服务器端响应缓存(输出缓存),发现了Respons... 查看详情

使用标签助手调用控制器,包括来自 asp.net core mvc 中搜索栏的数据

】使用标签助手调用控制器,包括来自asp.netcoremvc中搜索栏的数据【英文标题】:Callcontrollerwithtaghelpersincludingdatafromsearchbarinasp.netcoremvc【发布时间】:2019-06-1323:03:09【问题描述】:我对前端有点新,所以请耐心等待。我试图用asp... 查看详情