2012-01-13 16 views
5

के साथ अजाक्स पुल पर कैश डेटा प्रदर्शित करना मेरे पास एक उपकरण है जो क्रोम और एफएफ में पूरी तरह से ठीक काम करता है। लेकिन आईई के किसी भी संस्करण के साथ ब्राउज़र डेटा को पुनर्प्राप्त करने के लिए अजाक्स खींचने पर कैश जानकारी प्रदर्शित कर रहा है।इंटरनेट एक्सप्लोरर 304 परिणाम

मैं criterias है कि मैं पाश के माध्यम से:

यहाँ मेरी सेटअप है

@foreach (var item in Model) 
{ 
     <div class="sizeTDCriteria"> 
      @Html.DisplayFor(modelItem => item.Text) 
     </div> 
     <div class="sizeTDCriteriaAction"> 
      @Ajax.ImageActionLink(Url.Content("~/Content/images/icons/edit.png"), "Edit Criteria", "AddOrEditCriteria", "Management", new { competencySectionId = ViewBag.competencySectionId, criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "AddOrEditCriteriaFormContainer" }, new { @class = "iconPosition" }) 
      @Ajax.ImageActionLink(Url.Content("~/Content/images/icons/delete.png"), "Delete Criteria", "RemoveCriteria", "Management", new { criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "CompetenciesManagementWrapper" }, new { @class = "iconPosition" }) 
     </div> 
} 

ImageActionLink सिर्फ एक सहायक है कि अंदर एक छवि के साथ एक ActionLink बनाता है, मैं एक के साथ ऐसा करने की कोशिश की है है सामान्य एक्शनलिंक और समस्या भी होती है ताकि आप इसे अनदेखा कर सकें। मैंने बिना किसी अंतर के एक jQuery ट्रिगर के साथ एक सादा <img> द्वारा पूरे ImageActionLink को बदलने का भी प्रयास किया है।

क्या होता है कि जब कोई उपयोगकर्ता संपादन लिंक पर क्लिक करता है तो यह "AddOrEditCriteria" को एजेक्स कॉल करेगा, कि एक्शन रिसेट, मानदंड पाता है, और पार्टियल व्यू फॉर्म को div "#AddOrEditCriteriaFormContainer" में वापस प्रदर्शित करता है। अभी तक इतना अच्छा है, यह सभी ब्राउज़रों में ठीक काम करता है।

लेकिन जब मैं उस संपादन पर दूसरी बार क्लिक करता हूं, तो AJAX कॉल करने के बजाय, आईई केवल कैश में जो कुछ था उससे पार्टियल व्यू प्रदर्शित करता है, जब अन्य सभी ब्राउज़र सही ढंग से डेटा खींचते हैं (जो आवश्यक है, वह दृश्य मानदंडों को संपादित करने की अनुमति देता है, इसे किसी अन्य समय से संपादित किया जा सकता था)।

अजीब बात यह है कि आईई कॉल कर रहा है, लेकिन किसी भी तरह यह सर्वर तक पहुँच नहीं है, यह सिर्फ एक परिणाम 304 का उपयोग करके कैश का उपयोग करता आप इस नेटवर्क पर कब्जा से देख सकते हैं:

URL Method Result Type Received Taken Initiator Wait?? Start?? Request?? Response?? Cache read?? Gap?? 
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html 182 B < 1 ms JS Library XMLHttpRequest 
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html 182 B < 1 ms JS Library XMLHttpRequest 
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 200 text/html 1.53 KB 1.24 s JS Library XMLHttpRequest 

पिछले पहला ऐसा होता है, पहले दो किए गए थे और 304 रिटर्न प्राप्त कर रहे थे।

मुझे यादृच्छिक संख्या के साथ AJAX कॉल में "ब्रेक कैश" पैरामीटर जोड़कर इसे ठीक करने का एक तरीका मिला, लेकिन यह एक अच्छा समाधान की तरह प्रतीत नहीं होता है।

यह समस्या हमारे उपयोगकर्ताओं को खराब कर रही है क्योंकि वे डेटा देखते हैं जो IE के कारण सभी को अपडेट नहीं किया जाना चाहिए।

उत्तर

11

आईई AJAX GET एस कैश करेगा जबतक कि आप इसे न कहें।

आप इसे Cache-Controlheader के माध्यम से नहीं बताते हैं।

तो यहाँ हम क्या करना है:

[CacheControl(HttpCacheability.NoCache), HttpGet] 
public ActionResult MyAction() { return Json("Hi!", JsonRequestBehavior.AllowGet); } 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public sealed class CacheControlAttribute : ActionFilterAttribute 
{ 
    public CacheControlAttribute(HttpCacheability cacheability) 
    { 
     this._cacheability = cacheability; 
    } 

    public HttpCacheability Cacheability { get { return this._cacheability; } } 

    private HttpCacheability _cacheability; 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(_cacheability); 
    } 
} 
+2

धन्यवाद! यह काम करता है, मैंने यह भी पाया कि सहायक के बजाय jquery.ajax का उपयोग करके और 'कैश: झूठा' का उपयोग करके समस्या हल हो जाती है। लेकिन आप मुझे jquery का उपयोग करने के लिए अपने सभी विचारों को संपादित करने की अनुमति नहीं देंगे। दूसरी तरफ, मैं उम्मीद करता हूं कि सहायक के पास jquery.ajax की तरह कैश विकल्प होगा:/ फिर से धन्यवाद! – LanFeusT

+1

एक और विकल्प के रूप में, मुझे नियंत्रक स्तर पर नियंत्रण करना पसंद है: http://stackoverflow.com/questions/1160105/asp-net-mvc-disable-browser-cache/5546328#5546328 –

+1

@AdamTuliper आप इस विशेषता के साथ नियंत्रकों को लक्षित कर सकते हैं भी –

संबंधित मुद्दे