如何在每次加载页面时运行jQuery,甚至是从缓存中运行?

时间:2012-03-21 12:08:24

标签: javascript jquery asp.net caching

在我正在开发的网站上,有一个页面列出了网站上的所有用户(以及一些其他信息)。此页面与登录的所有人(至少在任何给定时间)相同,除了一个差异 - 他们自己的行被突出显示。所以在我看来,这将是一个理想的缓存候选者 - 我们不需要每个访问该页面的用户只在那一件事发生变化时重新计算和呈现页面上的数据。

我尝试通过向页面添加输出缓存并将表格行的突出显示移动到JavaScript(jQuery调用)来处理这个问题 - 我希望这个页面会被缓存,但每次都会运行JavaScript有人点击它,导致他们自己的行被突出显示。但是,情况似乎并非如此。如果我先点击网站,我的行会突出显示。然后,如果其他人在缓存到期时间内(在不同的机器上,那么它不是浏览器缓存的东西)点击页面,他们会看到突出显示我的行而不是他们自己的页面,直到缓存过期 - 然后每个人都会看到突出显示下一个页面的人突出显示的行,依此类推。它似乎是在执行JavaScript之后提供页面的缓存版本,而不是提供页面的缓存版本然后运行JavaScript。

有没有办法做我正在尝试做的事情 - 缓存页面,这样每次有人点击页面时我都不会执行ASP.NET调用,但每次加载页面时JavaScript都会运行新鲜另一行会突出显示?或者如果没有JavaScript,有没有办法做到这一点?我考虑使用setInterval定期检查突出显示(并重新突出显示正确的行),但这似乎有点过分,因为这只需要在页面加载后完成一次,并且永远不会再次执行页面重新加载。

以下是我的aspx文件的相关部分:

<%@ OutputCache Duration="60" VaryByParam="none" %>

<script type="text/javascript">

jQuery(document).ready(function($) {
    var isAuthenticated = ('<%= Context.User.Identity.IsAuthenticated %>' == 'True');

    if (isAuthenticated) {
        var owner = '<%= Context.User.Identity.Name %>';

        $('#' + owner).css("background-color", "#bdf");
    }
});

</script>

<table>
    <tr>
        <th>
            Owner
        </th>
        ...
    </tr>

<% foreach (var item in Model.Items) { %>

    <%= String.Format("<tr id=\"{0}\">", item.Owner) %>
        <td>
            <%= Html.Encode(item.Owner) %>
        </td>
        ...
    </tr>

<% } %>

</table>

4 个答案:

答案 0 :(得分:4)

在评估Context.User.Identity.IsAuthenticated之类的值之后缓存页面。因此,即使JavaScript在客户端上执行,它也已经包含缓存中的特定值(您的值)。

要做到这一点,你可以

  1. 完全从脚本中删除这些值,并执行AJAX请求以查看谁已登录。但请记住,如果浏览器禁用了JavaScript,则突出显示将无效。
  2. 按用户缓存页面

答案 1 :(得分:2)

我没有过去的ASP.NET经验,但在我看来,缓存机制只是首先执行代码,生成HTML,缓存它,并将生成的HTML提供给导航到该页面的每个人,直到缓存未过期。

这意味着:JS正确执行 - 行突出显示 - 但owner变量始终包含第一个访问该页面的用户名。您可以轻松检查是否属于这种情况,执行“查看源”。

说,我不认为你可以为你的场景使用这种缓存机制。

答案 2 :(得分:1)

您可以尝试使用Substitution控件将登录用户的动态名称插入缓存页面(这就是它的用途)。

要使用它,首先必须在页面类上创建一个静态方法,该方法将被Substitution控件调用并返回包含要插入的javascript的字符串。

public static string GetCurrentUserInfo(HttpContext context) 
{
    bool isAuthenticated = context.User.Identity.IsAuthenticated;
    string owner = "";
    if (isAuthenticated) owner = context.User.Identity.Name;

    return string.Format("var isAuthenticated = {0}; var owner = '{1}';", isAuthenticated, owner);
}

然后在脚本标记中添加控件:

<script type="text/javascript">
    <asp:Substitution ID="ownerInfo" runat="server" MethodName="GetCurrentUserInfo" />
</script>

Visual Studio不会喜欢你将控件放在那里,但它仍然可以正常运行。现在,您可以在jQuery方法中使用isAuthenticatedowner变量。

答案 3 :(得分:0)

您只能缓存列表项,而不能缓存用户身份验证。我并不常见于asp,因此我无法告诉您如何仅缓存部分网站。但我会尝试将javascript作为单独的页面(每个用户使用相同的URL),您可以输出当前用户名,由“静态”列表引用。或者您可以尝试使js保持静态,从cookie中获取用户名/身份验证状态,这些cookie是为每个用户单独存储的。