Как заставить мой jQuery запускаться при каждой загрузке страницы, даже из кеша? - PullRequest
3 голосов
/ 21 марта 2012

На разрабатываемом мной сайте есть страница, на которой перечислены все пользователи сайта (и некоторая другая информация) в виде таблицы.Эта страница идентична всем, кто входит в систему (по крайней мере, в любой момент времени), за исключением одного различия - выделяется их собственная строка.Поэтому мне показалось, что это был бы идеальный кандидат для кеширования - нам не нужен каждый пользователь, который переходит на эту страницу, чтобы пересчитать и отобразить данные на странице, когда меняется только одна вещь.

Я пыталсячтобы справиться с этим, добавив к странице выходное кеширование и переместив подсветку строки таблицы в JavaScript (вызов jQuery), я надеялся, что эта страница будет кэшироваться, но JavaScript будет запускаться каждый раз, когда кто-нибудь нажимает на нее, что приводит кв их собственном ряду выделяются.Однако, похоже, это не так.Если я сначала захожу на сайт, моя строка подсвечивается.Затем, если кто-то еще попадет на страницу в течение срока действия кеша (на другом компьютере, поэтому это не вещь кеша браузера), он увидит страницу с выделенной строкой my , а не своей собственной, до тех пор, пока кеш не появитсяистекает - и тогда все видят выделенную строку того, кто бы ни нажал на следующую страницу, и так далее.Похоже, что он обслуживает кэшированную версию страницы после выполнения 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 ]

4 голосов
/ 21 марта 2012

Страница кэшируется после оценки значений типа Context.User.Identity.IsAuthenticated.Таким образом, хотя JavaScript выполняется на клиенте, он уже содержит конкретные значения ( ваши значения) из кэша.

Чтобы сделать это правильно, вы можете либо

  1. удалить эти значения из скрипта в целом, и выполнить AJAX-запрос, чтобы увидеть, кто вошел в систему. Но помните, что выделение выигралоне работает вообще, если в браузере отключен JavaScript.
  2. кэширование страницы для пользователя
2 голосов
/ 21 марта 2012

У меня нет опыта работы с ASP.NET, но мне кажется, что механизм кэширования просто выполняет код при первом попадании, генерирует HTML, кэширует его и предоставляет этот сгенерированный HTML всем, кто переходит на эту страницу. До тех пор, пока кэш не истек.

Это означает: JS выполняется правильно - строка подсвечивается - но переменная owner всегда содержит имя пользователя, которое первым попало на эту страницу. Вы можете легко проверить, так ли это, выполнив «просмотр источника».

Скажите, я не думаю, что вы можете использовать этот тип механизма кэширования для вашего сценария.

1 голос
/ 21 марта 2012

Вы можете попробовать использовать элемент управления 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 не понравится, когда вы поместите элемент управления туда, но он все равно будет работать правильно. Теперь вы можете использовать переменные isAuthenticated и owner в вашем методе jQuery.

0 голосов
/ 21 марта 2012

Вы можете кэшировать только элементы списка, но не аутентификацию пользователя. Я не обычен для asp, поэтому я не могу рассказать вам, как кэшировать только части вашего сайта. Но я бы попытался доставить JavaScript как отдельную страницу (с одинаковым URL для каждого пользователя), где вы можете вывести текущее имя пользователя, на которое ссылается «статический» список. Или вы можете попытаться сделать свой js статичным, получая имя пользователя / состояние аутентификации из файлов cookie, которые хранятся индивидуально для каждого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...