Идентификатор и имя модели кэширования MVC Partial View

У меня есть частичное представление, которое используется в 2 местах, одно использует модель представления в пост-модели с добавленным вручную HtmlPrefix, поэтому идентификатор поля выглядит следующим образом:

id="Model_Address_AddressLine1"

В другом месте мне не нужна модель представления, а идентификатор просто «AddressLine1». Однако это тот же частичный взгляд.

Однако, если я сначала захожу на страницу с «Model_Address_AddressLine1», IIS кэширует это частичное представление, а затем, когда я перехожу на другую страницу, он не выполняет привязку и проверку модели, поскольку идентификатор кэшируется как «Model.Address.AddressLine1», и он не Не тяните "AddressLine1".

Я попытался установить для вызова ajax значение cache:false и установить NoStore для атрибута OutputCache действий, но он по-прежнему кэширует идентификаторы и имя модели частичных представлений, есть ли способ остановить это?

Добавил этот код, если он помогает, это вспомогательный код, который добавляет префикс на одну из страниц для частичного просмотра, но не на другую:

return helper.Partial(partialName, accessor.Compile().Invoke(helper.ViewData.Model),
                              new ViewDataDictionary(helper.ViewData)
                              {
                                  TemplateInfo = new TemplateInfo
                                  {
                                      HtmlFieldPrefix = prefix
                                  }
                              })

Заголовки ответа подтверждают кеширование:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:en -US,en;q=0.8 Cache-Control:max-age=0 Соединение: keep-alive Cookie:__RequestVerificationToken=qnKmH92lRoXCZWl_146N3uPiGRnWJCRZis6V_6cQ7mUJUdlVfAQVAxeTBtnhdTgM2s_NezoZghwRCrqBrv4GcjrCZr0XqG-6bHqh7; ASP.NET_SessionId=dh225cux11sckpxl2uke30q3; FedAuth = 77u / PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2VjdXJpdHlDb250ZXh0VG9rZW4gcDE6SWQ9Il9iZTI5MDk4OC01ZjdjLTQyZTktYjMxOS0zOGJhYzM5OTBlMjctMzg3NTUxQjQyM0JENjFDQzIwMEQyQTc2MTRBQzBDMDYiIHhtbG5zOnAxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3Mtc2VjdXJlY29udmVyc2F0aW9uLzIwMDUxMiI + PElkZW50aWZpZXI + dXJuOnV1aWQ6YTM1MWFmNjItYzU0Mi00MzQ2LWI2NzYtNGIyNjE0Y2YxMjU2PC9JZGVudGlmaWVyPjwvU2VjdXJpdHlDb250ZXh0VG9rZW4 + хост: 127.0.0.1: 444 User-Agent: Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537,36 (KHTML, как Gecko) Chrome / 34.0.1847.131 Safari / 537,36 источник отклика Headersview Cache-Control: без кэша, без хранилища Content-Encoding: gzip Content-Length: 9958 Content-Type: text/html; charset=utf-8 Дата: вторник, 13 мая 2014 г., 08:15:52 по Гринвичу. Срок действия: -1. Прагма: без кэша.


person User101    schedule 12.05.2014    source источник
comment
Установлены ли для кэширования и Outputcache значения false для обоих родительских методов, вызывающих частичное представление? Вы также удостоверились, что кеширование браузера отключено?   -  person SkyBlues87    schedule 12.05.2014
comment
@ SkyBlues87 Они оба вызывают одно и то же действие в одном и том же контроллере, так что да, это было установлено для обоих. Браузер его не кеширует, потому что, если я очистил кеш браузера, это все равно происходит, IIS его кеширует, но не может отключить.   -  person User101    schedule 12.05.2014
comment
Можете ли вы попробовать атрибут NoCache?   -  person Dmitry Zaets    schedule 12.05.2014
comment
Можете ли вы опубликовать заголовки ответов http из запросов страниц - в chrome, F12, сети выберите страницу после запроса, а затем заголовки ответа. Я был бы рад подтвердить, что кэширование работает должным образом.   -  person SkyBlues87    schedule 12.05.2014
comment
@SkyBlues87 добавлено выше   -  person User101    schedule 13.05.2014
comment
Мы изменили все партиалы на сайте, чтобы использовать ту же структуру и выше помощник, чтобы добавить htmlfieldprefix в результате, чтобы заставить его работать, не идеальное решение, но это единственный способ, который я могу найти. Я думаю, что кеширование вывода - это нечто другое, это кеширование компилятора в префиксе htmlfield, и я не знаю, как это остановить.   -  person User101    schedule 13.05.2014


Ответы (1)


Если вы измените RenderPartial на RenderAction, даже OutputCache будет нормально работать для вас. [OutputCache(Duration=0)]

Я использовал пользовательский атрибут для этой цели, он может быть полезен и вам:

public class NoCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

М.б. Статья Фила Хаака "Кэширование кольцевых отверстий в ASP.NET" MVC" тоже поможет?

person Dmitry Zaets    schedule 12.05.2014
comment
Это часто всплывало в моем поиске по этой проблеме, но атрибут кеша вывода не работает :( - person User101; 12.05.2014
comment
У меня это на всем контроллере, этого будет достаточно? Поскольку это не помогло ни общедоступному переопределению void OnResultExecuted(ResultExecutedContext filterContext) { if (filterContext == null) { throw new ArgumentNullException(filterContext); } filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow); filterContext.HttpContext.Response.Cache.SetNoStore(); } - person User101; 12.05.2014
comment
Можете ли вы также попробовать изменить RenderParial на RenderAction? - person Dmitry Zaets; 12.05.2014
comment
тот же результат с обоими :( - person User101; 13.05.2014
comment
Мы изменили все партиалы на сайте, чтобы использовать ту же структуру и выше помощник, чтобы добавить htmlfieldprefix в результате, чтобы заставить его работать, не идеальное решение, но это единственный способ, который я могу найти. Я думаю, что кеширование вывода - это нечто другое, это кеширование компилятора в префиксе htmlfield, и я не знаю, как это остановить. - person User101; 13.05.2014