2011-03-31 18 views
28

नहीं होना चाहिए यह वास्तव में मुझे अपने सिर को खरोंच कर रहा है। अर्थात् क्योंकि यह केवल आईई में होता है, फ़ायरफ़ॉक्स नहीं, और मैं इस धारणा के तहत था कि jQuery प्रभावी रूप से ब्राउज़र तटस्थ था। मैं पिछले कुछ घंटों से इस बात पर क्रैक कर रहा हूं और कम से कम, क्या हो रहा है, नीचे गिर गया है।jQuery AJAX 304 प्रतिक्रियाओं का उत्पादन करता है जब यह

यह jqGrid:

$("#DocumentListByPartRecordsGrid").jqGrid(
      { 
      datatype: 'local',    
      colNames: ['<b>Id</b>', '<b>Document Name</b>', '<b>Document Type</b>', '<b>Effective Date</b>', '<b>Expiration Date</b>', '<b>Delete</b>'], 
      colModel: [ 
        { name: 'ASSOCIATION_ID', Index: 'ASSOCIATION_ID', resizable: true, align: 'left', hidden: true, sortable: false }, 
        { name: 'FILE_NAME', Index: 'FILE_NAME', resizable: true, align: 'left', sortable: false, width:'20%' }, 
        { name: 'DOCUMENT_TYPE', Index: 'DOCUMENT_TYPE', resizable: true, align: 'left', sortable: false, width:'20%' }, 
        { name: 'EFFECTIVE_DATE', Index: 'EFFECTIVE_DATE', resizable: true, align: 'left', sortable: false, width:'20%' }, 
        { name: 'EXPIRATION_DATE', Index: 'EXPIRATION_DATE', resizable: true, align: 'left', sortable: false, width:'20%' }, 
        { name: 'Delete', Index: 'Delete',resizable: true, align: 'center', sortable: false, width:'20%' }, 
        ],    
      rowNum: 15, 
      rowList: [15, 50, 100], 
      imgpath: '/Drm/Content/jqGrid/steel/images', 
      viewrecords: true,    
      height: 162,   
      loadui: 'block', 
      forceFit: true 
     }); 

इस समारोह से भरा:

var mydata = '';  
<% if(!string.IsNullOrEmpty(Model.PCAssociatedDocuments)) { %>   
    var mydata = <%= Model.PCAssociatedDocuments %>; 
<% } %> 

for (var i = 0; i <= mydata.length; i++){ 
     jQuery("#DocumentListByPartRecordsGrid").addRowData(i, mydata[i], "last"); 
     } 

कौन सा सफाई से मॉडल से भर जाता है। यह मुद्दा नहीं है। समस्या तब आती है जब हटाने की कार्यक्षमता है, जो इतनी तरह नियंत्रक में वापस स्वरूपित है का उपयोग करते हुए:

<a class='deleteAttachment' style='cursor: pointer;' href='#' onclick='javascript:PCDocumentDelete(" + s.AssociationId.ToString() + ", " + pcId + ");'>Delete</a> 

इस समारोह

function PCDocumentDelete(id, pcid) { 
if (confirm("Are you sure you want to delete this document?")) { 
    $.blockUI({ 
     message: "Working...", 
     css: { 
      background: '#e7f2f7', 
      padding: 10 
     } 
    }); 
    $.ajax(
     { 
      url: '/DRM/Pc/DeleteAssociation?associationId=' + id + '&pcid=' + pcid, 
      async: true, 
      dataType: "json", 
      success: function(result) { 
       if (result.Success == true) { 
        //Reload grid      
        $.ajax({ async: false }); 
        $("#DocumentListByPartRecordsGrid").setGridParam({ url: "/Drm/Pc/DeAssociatePartRecordsWithDocument?pcid=" + pcid, datatype: 'json', myType: 'GET', page: 1 }); 
        $("#DocumentListByPartRecordsGrid").trigger("reloadGrid"); 
        $.unblockUI(); 
        $.showGlobalMessage('Specified document has been successfully disassociated from this part record.'); 
       } 
       else { 
        $.unblockUI(); 
        $.showGlobalMessage('An error occurred deleting the attachment.'); 
       } 
      }, 
      error: function(res, stat) { 
       alert(res.toString()); 
       alert(stat.toString()); 
      } 
     }); 
    return false; 
} 
else { 
    return false; 
} 

}

(showGlobalMessage एक आंतरिक समारोह है कि बनाता है और कहता है एक विशेष रूप से स्वरूपित ब्लॉकयूआई)

अजाक्स नियंत्रक में एक विधि वापस कॉल करता है, लेकिन इससे पहले कि हम इसे दूर करने से पहले समस्या उत्पन्न होती है, तब तक ईन यह महत्वपूर्ण सोचता है, मैं उस कोड को पोस्ट नहीं कर रहा हूं। क्या होता है, अक्सर अकल्पनीय कारणों के लिए, पीसी/DeleteAssociation कहने वाले AJAX का पहला विस्फोट 304 (संशोधित नहीं) प्रतिक्रिया के साथ वापस आ रहा है। मुझे पता है कि जब कुछ भी नहीं बदला जाता है तो उसे प्राप्त किया जाता है जिसे ताज़ा करने की आवश्यकता होती है। लेकिन यह एक प्राप्त नहीं है, इसे एक पद के रूप में माना जाना चाहिए, और मैं इस धारणा के तहत था कि jquery.ajax को तब तक डिजाइन किया गया था जब तक कि अन्यथा निर्देश न दिया गया हो, 304 प्रतिक्रियाएं उत्पन्न न करें। मैं स्पष्ट रूप से यहां कुछ खो रहा हूं और इसे खुद पकड़ने में बहुत लंबा लगा रहा हूं। कोई भी देखता है कि मुझे क्या याद आया? धन्यवाद।

उत्तर

43

मैं नहीं देख सकता, आप एक पोस्ट के रूप में AJAX अनुरोध निर्दिष्ट करते हैं। तो मूल रूप से जोड़ें:

$.ajax({ type: 'POST' }); 

और अगर है कि अभी भी (कुछ ब्राउज़र AJAX weirdness के कारण) में विफल रहता है, तो आप cache: false को सेट कर सकें:

$.ajax({ type: 'POST', cache: false }); 

Btw, सभी कैश: झूठी करता है, कुछ यादृच्छिक जोड़ रहा है अनुरोध यूआरएल के लिए सामान।

EDIT1:

के बारे में

... और मुझे यह धारणा थी कि jquery.ajax, जब तक अन्यथा निर्देश दिए, 304 प्रतिक्रियाओं

उत्पन्न नहीं करने के लिए डिजाइन किया गया था

jQuery यहां कोई प्रतिक्रिया उत्पन्न नहीं कर रहा है। और 304-हेडर सिर्फ एक HTTP शीर्षलेख है। HTTP AJAX अनुरोध सामान्य HTTP अनुरोध हैं और कोई मान्य शीर्षलेख वापस कर सकते हैं। यदि सर्वर 304 के साथ प्रतिक्रिया करता है, तो एक्सएचआर ऑब्जेक्ट बस सर्वर से स्थानीय रूप से कैश प्रतिक्रिया प्रदान करेगा। हालांकि, उपयोगकर्ता के लिए यह पूरी तरह से पारदर्शी है।

EDIT2:

कैशिंग को रोकने के बारे में सलाह निकाला गया। मुझे वूडू की तरह लगता है।

EDIT3:

जोड़ा गया है कि फिर से काटा, क्योंकि यह जाहिरा तौर पर जरूरी हो गया था। वेब के चारों ओर देखकर, आईई अवैध रूप से कुछ हद तक AJAX POST को कैश कर रहा है।

+1

यूप। @guildsbounty, अगर आप एक अजाक्स कॉल को POST के रूप में माना जाना चाहते हैं, तो आपको स्पष्ट रूप से यह कहना होगा; jQuery.ajax डिफ़ॉल्ट करने के लिए डिफ़ॉल्ट है। ऐसा लगता है कि जिस तरह से आप कॉल कर रहे हैं, वह एक जीईटी की उम्मीद कर रहा है, हालांकि, आप इसे यूआरएल पैरामीटर पास कर रहे हैं, भले ही यह एक डिलीट ऑपरेशन प्रतीत होता है, जो थोड़ा अजीब लगता है ... –

+1

अजीब रूप से पर्याप्त है, वूडू बिट अंत में क्या काम किया था। यहां तक ​​कि पोस्ट 304 उत्पन्न कर रहा था। मैंने कैशिंग रोकथाम का उपयोग किया और इसे ठीक किया ... मदद के लिए धन्यवाद। – guildsbounty

+0

@guildsbounty:: डी अजीब। मैंने थोड़ा सा देखा और आईई वास्तव में वहां मुद्दों के लिए लगता है। इसे वापस संपादित किया गया। प्रतिक्रिया के लिए धन्यवाद! – skarmats

20
  1. हमेशा संशोधित करने वाले तरीकों के लिए कॉल के लिए POST का उपयोग करें, न कि प्राप्त करें। आईई को अनुरोध को कैश करने से रोकने के लिए यह इस उदाहरण में पर्याप्त होना चाहिए।
  2. आईई आक्रामक रूप से AJAX अनुरोधों को कैश करता है (http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/ और https://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/ देखें)। इसे रोकने के लिए, आप कर सकते हैं:
    1. कैश बस्टिंग पैरामीटर जोड़ें ($.ajaxSetup({ cache: false }); यह स्वचालित रूप से करता है।
    2. हमेशा POST अनुरोधों का उपयोग करें (शायद अधिकांश मामलों में उपयुक्त नहीं है)।
    3. AJAX अनुरोध सर्वर पक्ष के लिए कैश हेडर चालू करें। पहला लिंक दिखाता है कि ग्रोवी में इसका उपयोग कैसे किया जाए। इसी तरह के तरीकों को किसी भी ढांचे पर लागू होना चाहिए।
+0

वैश्विक AJAX पैरामीटर को सेट करना $ .load() विधि का उपयोग करते समय एक ही समस्या को हल करता है। – lhoess

+3

* AJAX अनुरोध सर्वर पक्ष के लिए कैश हेडर चालू करें * - 'कैश-कंट्रोल: नो-कैश' या 'मेरे जैसे आलसी लोगों के लिए' समाप्ति: -1'। – ulidtko

0

कैश पर्दाफाश हल है!

मेरे मामले में एप्लिकेशन ने सर्वर के निजी हिस्से में ब्राउज़र को पुल करने के लिए प्रॉक्सी के रूप में कस्टम हेडर के साथ एक ही सेवा कॉल का उपयोग किया था (प्रत्येक कॉल उसी यूआरएल पर जाती थी, लेकिन प्रॉक्सी को बताने के लिए कस्टम हेडर का उपयोग करती थी सेवा जो इसे पास करने के लिए सेवा)। सबकुछ क्रोम और एफएफ पर ठीक काम करता था लेकिन आईई ने पेज पर बने पहले कॉल से डेटा वापस रखा। cache = jQuery.ajax में झूठा विकल्प ठीक था क्योंकि आईई ने उसी यूआरएल को बुलाया था, इस बात पर भी परेशान नहीं था कि क्या कोई कस्टम हेडर इस्तेमाल किया गया था या क्या शरीर में अलग-अलग डेटा भी पारित किया गया था, और बस ने कहा, "ओह, मुझे यह पता है, यहाँ .." और पहली कॉल की प्रतिक्रिया वापस दे दी। कैश बस्टिंग तकनीक के साथ यूआरएल आईई के लिए अलग दिखता है, इसलिए इसे इसे भेज दिया जाता है।

+0

HTTP कैश-कंट्रोल भी आपकी समस्या का समाधान करेगा। – ulidtko

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