Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让jQuery在每次加载页面时运行,即使是从缓存中加载?_Javascript_Jquery_Asp.net_Caching - Fatal编程技术网

Javascript 如何让jQuery在每次加载页面时运行,即使是从缓存中加载?

Javascript 如何让jQuery在每次加载页面时运行,即使是从缓存中加载?,javascript,jquery,asp.net,caching,Javascript,Jquery,Asp.net,Caching,在我正在开发的站点上,有一个页面在一个表中列出了站点上的所有用户(以及一些其他信息)。此页面与登录的每个人都相同(至少在任何给定时间),只是有一个区别-他们自己的行突出显示。因此,在我看来,这将是缓存的理想候选者-我们不需要每个点击该页面的用户在只有一件事情发生变化时重新计算和呈现页面上的数据 我试图通过向页面添加输出缓存来处理这个问题,并将表行的高亮显示移动到JavaScript(一个jQuery调用)——我希望这个页面会被缓存,但JavaScript会在每次有人点击它时运行,从而导致他们自己

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

我试图通过向页面添加输出缓存来处理这个问题,并将表行的高亮显示移动到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>

jQuery(文档).ready(函数($){
var isAuthenticated=(''=='True');
如果(未经验证){
var所有者=“”;
$(“#”+owner).css(“背景色”,“#bdf”);
}
});
所有者
...
...

您只能缓存列表项,而不能缓存用户身份验证。我不是asp的普通用户,所以我无法告诉您如何只缓存站点的一部分。但是我会尝试将javascript作为一个单独的页面(每个用户都有相同的url)交付,在这里您可以输出当前用户名,由“静态”列表引用。或者,您可以尝试将js设置为静态,从为每个用户单独存储的Cookie中获取用户名/身份验证状态。

在计算诸如
Context.user.Identity.IsAuthenticated等值后,将缓存页面。因此,即使JavaScript在客户端上执行,它也已经包含缓存中的特定值(您的值)

要做到这一点,你可以

  • 从脚本中完全删除这些值,并执行AJAX请求以查看谁已登录。但是请记住,如果浏览器禁用了JavaScript,高亮显示将根本无法工作
  • 缓存每个用户的页面

  • 我没有ASP.NET方面的经验,但在我看来,缓存机制只是在第一次命中时执行代码,生成HTML,缓存它,并将生成的HTML提供给导航到该页面的每个人,直到缓存未过期

    这意味着:JS被正确执行–行被突出显示–但是
    owner
    变量始终包含第一个到达该页面的用户名。您可以通过“查看源代码”轻松检查情况是否属实

    这么说吧,我不认为您可以在您的场景中使用这种缓存机制。

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

    要使用它,首先必须在page类上创建一个静态方法,该方法将被替换控件调用,并返回一个包含要插入的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>
    
    
    

    VisualStudio不喜欢您将控件放在那里,但它仍然可以正常工作。现在,您可以在jQuery方法中使用
    isAuthenticated
    owner
    变量。

    这很有意义。我不知道为什么我没有想到被计算的
    Context.User.Identity
    值也被缓存了。我想我将不得不使用每用户缓存(这是我一直使用的临时解决方案,但我一直希望我可以利用页面的其余部分,除了突出部分相同之外),然后切换回ASP.NET代码中的高亮显示,这样即使禁用JavaScript也能正常工作。请查看我的答案,了解使用替换控件的替代方法,这将使您不必使用任何AJAX调用。这是一种有趣的方法。对于这个页面,每个用户的缓存似乎可以正常工作,但我可能会在其他两个页面上尝试这种方法,在这些页面上,我有类似的情况(大多数是静态数据,根据用户的不同,只有几个不同的值)。