Asp.Net核心缓存标记帮助器

时间:2018-10-01 14:21:52

标签: .net asp.net-mvc asp.net-core .net-core

我正在尝试缓存包含固定的仪表板和用户个人资料图像的顶部导航栏,我正在使用“缓存”标签帮助程序来缓存顶部的导航栏,但是当用户更改固定的仪表板或其个人资料图像时,我想使其无效缓存以加载新的个人资料图片。

    <cache vary-by="@userService.ProfileChanged">
    <header class="header">
    <nav class="navbar fixed-top navbar-light bg-light d-flex justify-content-between">
        <ul class="main-nav-icons list-unstyled d-flex flex-fill mr-3">
            <cache vary-by="@userService.PinnedDashboardsChanged">
                @await Component.InvokeAsync("UserDashboards", new { type = "pinned" })
            </cache>
            <li><button class="btn btn-unstyled left-nav-toggler"><i class="glyphicons glyphicons-option-horizontal text-primary1"></i></button></li>
        </ul>
        <cache vary-by="@userService.ProfileChanged">
            <ul class="d-flex justify-content-end align-items-center user-menu mb-0 flex-fill list-unstyled">
                <li>
                    <ul class="user-menu-details d-flex mr-2 list-unstyled mb-0 flex-column flex-md-row">
                        <li class="list-inline-item">@(userService.User.UserTypeId == 1 ? "Dios Kernel" : userService.User.Environment.Name)</li>
                        <li class="list-inline-item"> <a href="@Url.Action("Index", "Profile")">@userService.User.FullName</a></li>
                    </ul>
                </li>
                <li class="list-inline-item user-avatar">
                    <div class="dropdown">

                        <a class="dropdown-toggle avatar-img" data-toggle="dropdown" style="background-image:url('@(string.IsNullOrEmpty(userService.User.ProfilePhoto) ? "/images/user-pic.png" : userService.User.ProfilePhoto)')">
                            @*<img src="@(string.IsNullOrEmpty(userService.User.ProfilePhoto) ? "/images/user-pic.png" : userService.User.ProfilePhoto)" alt="@userService.User.FullName">*@
                        </a>

                        <div class="dropdown-menu">
                            <a class="dropdown-item" onclick="editProfile('@Url.Action("_Edit","Profile")')">
                                <i class="fas fa-user-alt"></i>
                                Edit Profile
                            </a>
                            <a class="dropdown-item" onclick="resetPassword('@Url.Action("_ResetPassword","Account")')">
                                <i class="fas fa-lock"></i>
                                Change Password
                            </a>
                            <a class="dropdown-item" href="@Url.Action("Logout","Account")">
                                <i class="fas fa-sign-out-alt"></i>
                                Logout
                            </a>
                        </div>
                    </div>
                </li>
            </ul>
        </cache>
    </nav>
</header>
</cache>

我使用了“ by-by”并使用了ProfileChanged属性,当用户更新配置文件时,该属性会更改为true;但是当我遇到奇怪的行为时,这是任何页面上的第一次刷新都显示新更改,而其他行为则没有,我希望更改后的第一个请求将为其他页面再次重新缓存导航。

1 个答案:

答案 0 :(得分:0)

您对工作流程感到困惑,因此请考虑逐步进行此操作。

在此示例中,我做了一个简单的.net核心项目,其中的剃须刀页面在路径查询中接受int abool b这两个参数。

在剃须刀视图中,我将看到以下内容:

<cache vary-by="@a">
    Time at @a @DateTime.Now;
</cache>
<br />
<cache vary-by="@b">
    Time at @b @DateTime.Now;
</cache>

现在让我们逐步了解一些结果

  1. 第一个请求,查询:?a=1&b=true 时间为1 01/10/2018 19:31:11 ; 真实时间 01/10/2018 19:31:11 ;
  2. 第二个请求,查询:?a=2&b=true 时间为2 01/10/2018 19:31:20 ; 真实时间 01/10/2018 19:31:11 ;
  3. 第三个请求,查询:?a=2&b=false 时间为2 01/10/2018 19:31:20 ; 错误时间 2018年1月10日19:31:32 ;
  4. 第四个请求,查询:?a=1&b=false 时间为1 01/10/2018 19:31:11 ; 错误时间 2018年1月10日19:31:32 ;

现在解决您的问题。您必须将ProfileChanged的值设置为时间戳,否则如果刷新后将ProfileChanged的默认值重新设置为false时未将其保存到数据库中,则将保留键false 的先前缓存结果,该键默认存储20分钟