ASP.NET MVC 2 RC проблема с кэшированием - PullRequest
1 голос
/ 08 января 2010

После обновления с mvc 2 beta 2 до rc у меня возникают проблемы с отправкой ajax в Internet Explorer. После выполнения сообщения формы jquery функция возвращает URL-адрес действия контроллера. Это работало нормально, когда действие контроллера подбиралось как ajaxrequest, а затем возвращалось частичное представление для обновления страницы. Это все еще отлично работает в Firefox, однако в Internet Explorer последний вызов действия контроллера теперь поступает из кэша и возвращает, поэтому возвращает полное представление, а не частичное.

Я попытался установить выходной кэш в 0 безуспешно, и я также попытался nocache actionfilter, как описано здесь Безуспешно отключить кэш браузера для всего сайта ASP.NET . Единственный способ остановить извлечение IE из кэша - физически удалить кэшированную версию.

У кого-нибудь есть идеи (извинения, если это не очень понятно, сложно объяснить!)?

Ответы [ 2 ]

3 голосов
/ 08 января 2010

По какой-то причине IE очень агрессивно относится к кешированию AJAX GET. Так что, если вы получаете это через AJAX, поведение меня не удивляет. Также неудивительно, что использование атрибута кэша вывода не решило проблему, потому что кеширование выполняет IE, а не сервер. Что вам нужно сделать, это сказать IE не кэшировать запрос, установив соответствующие заголовки в HTTP. Вот как мы это делаем:

    [CacheControl(HttpCacheability.NoCache), HttpGet]
    public JsonResult DoStuff()
    {
        //...
    }

public class CacheControlAttribute : ActionFilterAttribute
{
    public CacheControlAttribute(HttpCacheability cacheability)
    {
        this._cacheability = cacheability;
    }

    private HttpCacheability _cacheability;

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(_cacheability);
    }
}
0 голосов
/ 19 декабря 2011

Мои 2 цента к отличному решению Крейга -

Если вы используете пользовательский элемент управления и визуализируете его с помощью RenderAction

<% Html.RenderAction("UserList", "User"); %>

И эта страница вызывает ее как через GET, так и через POST, тогда не упоминайте метод запроса в объявлении атрибута.

[CacheControl(HttpCacheability.NoCache)]

Например, у меня есть поисковая таблица и панель поиска поверх нее. Я сделал свой Grid пользовательским элементом управления, чтобы я мог вызывать сортировку и пейджинг через AJAX (GET), но он также вызывается при нажатии кнопки «поиск» (POST), поэтому он мне нужен для обоих.

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