0

나는 사람이 수동으로 HtmlPrefix을 추가 된과 게시물 모델에서 뷰 모델을 사용하고,이 개 장소에서 사용되는 부분도있다, 그래서 id 필드는 다음과 같습니다MVC는 부분보기 캐싱 모델 ID와 이름

id="Model_Address_AddressLine1" 

다른 곳에서는보기 모델이 필요하지 않으며 ID는 단지 "AddressLine1"입니다. 그러나 동일한 부분보기입니다.

"Model_Address_AddressLine1"이있는 페이지를 먼저 방문하면 IIS가이 부분보기를 캐시에 저장 한 다음 다른 페이지로 이동할 때 ID가 "Model.Address.AddressLine1"로 캐싱되어 유효성을 검사하지 않습니다 ""AddressLine1 "을 가져 오지 않습니다.

ajax 호출을 cache : false로 설정하고 NoStore를 작업 OutputCache 특성에 설정하려고했으나 여전히 부분 뷰 모델 ID와 이름을 캐시합니다.이 작업을 중단하는 방법이 있습니까?

:

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

응답 헤더가 캐싱을 확인 :

이 추가 된,이 헬퍼 부분 뷰의 페이지 중 하나에 접두사를 추가 코드가 아닌 다른 도움이된다면이 코드입니다 Accept-Encoding : gzip, deflate, sdch Accept-Language : en-US, text/html, application/xhtml + xml, application/xml, q = 0.9, image/webp, /, q = 0.8 en = q = 0.8 캐시 제어 : max-age = 0 연결 : keep-ali ve 쿠키 : __ RequestVerificationToken = qnKmH92lRoXCZWl_146N3uPiGRnWJCRZis6V_6cQ7mUJUdlVfAQVAxeTBtnhdTgM2s_NezoZghhwCrqBrv4GcjrCZr0XhG-6bHq7kfhlRrw1; ASP.NET_SessionId = dh225cux11sckpxl2uke30q3; FedAuth = 77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2VjdXJpdHlDb250ZXh0VG9rZW4gcDE6SWQ9Il9iZTI5MDk4OC01ZjdjLTQyZTktYjMxOS0zOGJhYzM5OTBlMjctMzg3NTUxQjQyM0JENjFDQzIwMEQyQTc2MTRBQzBDMDYiIHhtbG5zOnAxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3Mtc2VjdXJlY29udmVyc2F0aW9uLzIwMDUxMiI + PElkZW50aWZpZXI + dXJuOnV1aWQ6YTM1MWFmNjItYzU0Mi00MzQ2LWI2NzYtNGIyNjE0Y2YxMjU2PC9JZGVudGlmaWVyPjwvU2VjdXJpdHlDb250ZXh0VG9rZW4 + 호스트 : 127.0.0.1 : 444 사용자 에이전트 : 모질라/5.0 (윈도우 NT 6.1; WOW64) AppleWebKit/537.36 (게코 같은 KHTML) 크롬/34.0.1847.131 사파리/537.36 응답 헤더보기 소스 캐시 제어 : no-cache, no-store 콘텐츠 인코딩 : gzip 콘텐츠 길이 : 9958 내용 유형 : text/html; 문자셋 = UTF-8 날짜 : 2014년 (화) (13) 월 그리니치 표준시 08시 15분 52초 는 사용 기간 제한 없음 : -1 에서 Pragma : 비바리에는 캐시 : 수락 - 인코딩 X-프레임 - 옵션 : SAMEORIGIN

+0

partialview를 호출하는 부모 메서드 모두에서 캐싱 및 Outputcache를 false로 설정 했습니까?브라우저 캐싱을 해제했는지 확인 했습니까? – SkyBlues87

+0

@ SkyBlues87 두 컨트롤러 모두 같은 컨트롤러에서 동일한 동작을 호출하므로 둘 다 설정되었습니다. 브라우저 캐시를 지우면 IIS가 여전히 캐시하지만 캐시를 끌 수 없기 때문에 브라우저는 캐시하지 않습니다. – User101

+0

NoCache 속성을 사용해 볼 수 있습니까? –

답변

0

하는 경우를 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); 
    } 
} 

M.b. Phil Haack의 기사 "Donut Hole Caching in ASP.NET MVC"도 도움이 될 것입니다.

+0

이것은이 문제에 대한 내 인터넷 검색에 많이 나온,하지만 출력 캐시 특성이 작동하지 않습니다. ( – User101

+0

전체 컨트롤러에이 충분합니까? 그 일을하는 데 도움이되지 않았으므로 public override void OnResultExecuted (ResultExecutedContext filterContext) { 경우 (filterContext == NULL) { 던져 새로운 경우 ArgumentNullException ("filterContext"); } filterContext.HttpContext.Response.Cache.SetCacheability (HttpCacheability.NoCache) filterContext.HttpContext .Response.Cache.SetExpires (DateTime.UtcNow); filterContext.HttpContext.Response.Cache.SetNoStore(); } – User101

+0

RenderParial을 RenderAction으로 변경할 수도 있습니까? –