Не удается отключить кеш jQuery - PullRequest
3 голосов
/ 26 мая 2010

Обновление

Я понял, что это проблема с кешированием, но я не могу отключить кеш. Вот мой измененный скрипт:

<script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
        jQuery.ajaxSetup({
            // Disable caching of AJAX responses 
            cache: false
        });

        jQuery("#button1").click(function (e) {
            window.setInterval(refreshResult, 3000);
        });

        function refreshResult()
        {
            jQuery("#divResult").load("/Home/Refresh");
        }
</script>

Обновляет часть веб-страницы каждые 3 секунды. Он работает только один раз после очистки кэша веб-браузера, после чего он не работает - запросы отправляются в / Home / Refresh без интервала 3 секунды, данные отправляются с сервера, но на веб-странице ничего не отображается; последующие запросы отправляют куки ASP.NET_SessionId = wrkx1avgvzwozcn1frsrb2yh. Я использую ASP.NET MVC 2 и c #.




У меня проблема с jQuery, вот как работает мое веб-приложение

  • Веб-страница Search.aspx, которая содержит форму и скрипт jQuery отправляет данные в действие Search () в контроллере Home после того, как пользователь нажмет кнопку button1.

search.aspx:

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<GLSChecker.Models.WebGLSQuery>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Title  
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Search</h2>

    <% Html.EnableClientValidation(); %>

    <% using (Html.BeginForm()) {%>    
        <fieldset>
            <div class="editor-label">
                <%: Html.LabelFor(model => model.Url) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Url, 
                    new { size = "50" } ) %>
                <%: Html.ValidationMessageFor(model => model.Url) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Location) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Location, 
                    new { size = "50" } ) %>
                <%: Html.ValidationMessageFor(model => model.Location) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.KeywordLines) %>
            </div>
            <div class="editor-field">
                <%: Html.TextAreaFor(model => model.KeywordLines, 10, 60, null)%>  
                <%: Html.ValidationMessageFor(model => model.KeywordLines)%>
            </div>

            <p>
                <input id ="button1" type="submit" value="Search" />
            </p>
        </fieldset>

    <% } %>

    <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        jQuery("#button1").click(function (e) {
            window.setInterval(refreshResult, 5000);
        });

        function refreshResult()
        {
            jQuery("#divResult").load("/Home/Refresh");
        }
    </script>

   <div id="divResult"> 
   </div>

</asp:Content>
        [HttpPost]
        public ActionResult Search(WebGLSQuery queryToCreate)
        {
            if (!ModelState.IsValid)
                return View("Search");

            queryToCreate.Remote_Address = HttpContext.Request.ServerVariables["REMOTE_ADDR"];
            Session["Result"] = null;

            SearchKeywordLines(queryToCreate);

            Thread.Sleep(15000);

            return View("Search");
        }//Search()
  • После нажатия кнопки button1 запускается вышеуказанный скрипт с веб-страницы Search.aspx.

  • Действие Search () в контроллере выполняется в течение более длительного периода времени. Я симулирую это в тестировании путем помещения Thread.Sleep (15000); в поиске () action.

  • 5 сек. после нажатия кнопки «Отправить» приведенный выше скрипт jQuery вызывает Действие Обновить () в домашнем контроллере.

        public ActionResult Refresh()
        {               
            ViewData["Result"] = DateTime.Now;

            return PartialView();
        }
  • Refresh () отображает эту часть

<% @ Control Language = "C #" Inherits = "System.Web.Mvc.ViewUserControl" %>

<% = ViewData ["Result"]%>

Проблема в том, что в Internet Explorer 8 есть только один запрос к / Home / Refresh; в Firefox 3.6.3 все запросы к / Home / Refresh выполняются, но на веб-странице ничего не отображается. Другая проблема с Firefox заключается в том, что запросы к / Home / Refresh выполняются каждую секунду, а не каждые 5 секунд.
Я заметил, что после очистки кеша Firefox скрипт работает хорошо при первом нажатии кнопки 1, но после этого он не работает.

Буду признателен за полезные советы.

Ответы [ 5 ]

3 голосов
/ 24 декабря 2010

Это немного старый вопрос сейчас. Но у меня была проблема, которая, как мне казалось, была связана с кэшированием, но оказалась чем-то другим, и я подумал, что кто-то в какой-то момент может найти это полезным.

У меня был набор процедур, которые пошли примерно так

  1. MAIN PAGE вызывает SUB PAGE через .load. SUB PAGE имеет таблицу для ввода данных и гиперссылки для запуска SQL PAGE для выполнения соответствующих SQL

  2. После ввода данных на дополнительной странице (через главную страницу), нажмите на гиперссылку обновляет базу данных, используя SQL PAGE, а затем обновляет ГЛАВНАЯ СТРАНИЦА div, которая содержит ПОДПИСЬ

Ну ... в течение нескольких часов я продолжал вводить данные, затем нажимал на соответствующие ссылки только для того, чтобы обнаружить, что раздел ГЛАВНОЙ СТРАНИЦЫ иногда обновляется, а иногда нет. F5 всегда работал, хотя Так что я был почти уверен, что у меня проблема с кешем. Поэтому я перестал использовать .load и начал использовать .ajax, используя «cache: false». Я мог видеть, что .ajax теперь подходящим образом рандомизировал URL-адрес get, но мой раздел MAIN PAGE все еще не обновлялся. Я был уверен, что у меня проблема с кэшированием ...

Но я не сделал.

Используя инструменты разработки Google Chrome - я мог видеть, что когда-то моя подпрограмма jQuery выполняла именно то, что должна была делать, т.е.

a) Нажмите SUB PAGE; выполнить SQL PAGE; обновить ГЛАВНАЯ СТРАНИЦА div

И иногда вещи происходили в таком порядке ...

б) Нажмите SUB PAGE; обновить ГЛАВНУЮ СТРАНИЦУ div; выполнить SQL PAGE

Мой код был написан для выполнения а), но поскольку выполнение SQL PAGE заняло некоторое время, б) было фактически тем, что происходило. И б) было плохо - мой блок MAIN PAGE фактически обновлялся, но SQL для обновления моих таблиц данных не выполнялся до обновления.

Как только я понял это, исправить было легко. Используя .ajax, я реализовал следующую логику:

i) Нажмите SUB PAGE II) Выполнить SQL PAGE iii) При условии успешного выполнения SQL PAGE (с использованием параметра «success:» в .ajax), затем обновите div ГЛАВНОЙ СТРАНИЦЫ, содержащий SUB PAGE iv) Я оставил «cache: false» на всякий случай

Это исправление работает 100% времени для моего кода

Так что, если вы пытаетесь понять, почему кэширование не отключается, просто убедитесь, что у вас действительно есть проблема с кэшированием, а не проблема, описанная выше.

Удачи

1 голос
/ 03 мая 2012

Любая браузерная обработка ajax. Никогда не кэшируется.

// Global Vars
var ajaxRefreshCount = 0;
var ajaxRequestsCount = 0;

// Call this function for the ajax request
function ajaxRequest(name)
{
    ajaxRefreshCount++;
    ajaxRequestsCount++;
    var reqAjax = jQuery.get("/?ajax=" + name + "&r="+ajaxRefreshCount+"&s="+new Date().getTime(), function (data) { ajaxCallback(data, name)} );
}

function ajaxCallback(data, ajaxRequestName)
{
    ajaxRequestsCount--;

        // Your Stuff
        if (ajaxRequestName == "home_refresh")
            jQuery("#divResult").html(data);

    if (ajaxRequestsCount == 0) ajaxFullyLoaded();
}

function ajaxFullyLoaded()
{
    // Execute when all ajax requests where processed
}

// Example for home refresh
ajaxRequest("home_refresh");
1 голос
/ 27 мая 2010

Вы можете изменить запрошенный URL-адрес, добавив отметку времени как часть параметров GET:

function refreshResult()
{
  jQuery("#divResult").load("/Home/Refresh?"+(+new Date()));
}

Это должно игнорировать кеш браузера (так как URL меняется каждый раз). Конечно, это то, что делает для параметра jQuery cache значение false в запросах ajax, я просто не уверен на 100%, что .load() будет использовать этот параметр.

0 голосов
/ 27 мая 2010

Я нашел решение, я заменил

<% using (Html.BeginForm()) {%>

с

<% using (Ajax.BeginForm(null)) {%>
0 голосов
/ 26 мая 2010

Проблема IE8 может заключаться в том, что IE кеширует похожие запросы, но я не слишком знаком с внутренними компонентами JQueries, если они обрабатывают это или нет, решение может состоять в том, чтобы добавить случайную переменную get.

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