سؤال

أنا ألعب مع ASP.net MVC وJQuery في الوقت الحالي.لقد صادفت سلوكًا لا يبدو منطقيًا.

أنا أتصل بـ JQuery $.getJSON وظيفة لملء بعض div.يتم تشغيل الحدث على $(document).ready حدث.هذا يعمل بشكل مثالي.

هناك صغيرة AJAX.BeginForm مما يضيف قيمة أخرى لاستخدامها عند ملء div.يقوم باستدعاء الوظيفة البعيدة بشكل صحيح وعند النجاح يستدعي وظيفة جافا سكريبت الأصلية لإعادة ملء div.

وهنا الجزء الغريب:في فايرفوكس وكروم - كل شيء يعمل.ولكن في IE8 (بيتا)، فإن هذا الاستدعاء الثاني للنص Div النصي (الذي يستدعي الدالة $.getJSON) يحصل على بيانات مخزنة مؤقتًا ولا يطلب من الخادم!

آمل أن يكون هذا السؤال منطقيًا:في قشرة الجوز - لماذا $.getJSON الحصول على البيانات المخزنة مؤقتا؟ولماذا يؤثر فقط على IE8؟

هل كانت مفيدة؟

المحلول

فقط لإعلامك، يعتبر Firefox وChrome أن جميع طلبات Ajax غير قابلة للتخزين المؤقت.يتعامل IE (جميع الإصدارات) مع مكالمات Ajax تمامًا مثل طلبات الويب الأخرى.ولهذا السبب ترى هذا السلوك.
كيفية إجبار IE على تنزيل البيانات عند كل طلب:

  • كما قلت، استخدم خيار "ذاكرة التخزين المؤقت" أو "nocache" في JQuery
  • إضافة معلمة عشوائية إلى الطلب (قبيح، لكنه يعمل :))
  • من جانب الخادم، قم بتعيين إمكانية التخزين المؤقت (على سبيل المثال، استخدام إحدى السمات، انظر أدناه)

شفرة:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

نصائح أخرى

وهذه هي الطريقة التي عملت بالنسبة لي ...

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });

وبفضل كينت لإجابتك. باستخدام $ .ajax ( '{مخبأ: لا}')؛ عملت تماما. [عدل]

وأو على الأقل اعتقدت فعلت. يبدو أن مسج $ .getJSON لا قراءة أي تغييرات يتم إجراؤها على الكائن $ .ajax.

والحل الذي انتهى العمل كان لإضافة معلمة جديدة يدويا

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);

والقرار الآن هو فقط للدقيقة. وهو ما يعني فعليا هذا الحل لا يزال تخزين تصل حتى لدقيقة واحدة. هذا هو مقبول لأغراض بلدي.

وأنا حل هذه المشكلة عن طريق وضع نفس السمة التالية على العمل في وحدة التحكم:

[OutputCache(Duration = 0, VaryByParam = "None")]

إذا كنت تستخدم ASP.net MVC، النظر في إضافة وسيلة التمديد لتنفيذ بسهولة لا التخزين المؤقت مثل ذلك:

    public static void NoCache(this HttpResponse Response)
    {
        Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.MinValue);
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetValidUntilExpires(false);

        Response.Expires = -1;
        Response.ExpiresAbsolute = DateTime.MinValue;
        Response.AddHeader("Cache-Control", "no-cache");
        Response.AddHeader("Pragma", "no-cache");
    }

وقد تحتاج إلى إرسال مخبأ ثقيل.

وأود أن أوصي باستخدام $ .ajax ({مخبأ: لا}) فقط في حالة (يضيف لاحقة عشوائية لطلب الحصول على)

و(أنا أميل إلى استخدام $ .ajax في كل مكان هذه الأيام، أكثر يمكن تقسيمه وتضبيطه)

وعلى استعداد للإجابة؟

http://lestopher.tumblr.com/ آخر / 21742012438 / إذا-باستخدام-كنت IE8-وgetjson

وهكذا، فقط إضافة

jQuery.support.cors = true;  

وفي بداية السيناريو الخاص بك وBANG يعمل!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top