get .getJSON আইই 8-তে ক্যাশ করা ডেটা ফিরছে


102

আমি এই মুহুর্তে এএসপিএনটি এমভিসি এবং জিকুয়েরির সাথে খেলছি। আমি এমন আচরণের মুখোমুখি হয়ে এসেছি যা মনে হয় না।

আমি কিছু ডিভ এর জনিত জন্য JQuery এর $.getJSONফাংশন কল করছি । ইভেন্টটি ইভেন্টটিতে ট্রিগার করা হয় $(document).ready। এটি পুরোপুরি কাজ করে।

একটি ছোট আছে AJAX.BeginFormযা ডিভিএসকে পপুলেট করার সময় ব্যবহার করতে আরও একটি মান যুক্ত করে। এটি রিমোট ফাংশনটিকে সঠিকভাবে কল করে এবং সাফল্যের সাথে ডিভগুলি পুনরায় তৈরি করতে মূল জাভাস্ক্রিপ্ট ফাংশনটি কল করে।

অদ্ভুত অংশটি এখানে: ফায়ারফক্স এবং ক্রোমে - সমস্ত কিছুই কাজ করে। কিন্তু আইই 8-তে (বিটা) পপুলেট ডিভ স্ক্রিপ্টের দ্বিতীয় কলটি (যা $ .getJSON ফাংশনটি কল করে) ক্যাশেড ডেটা পেয়ে যায় এবং সার্ভারকে জিজ্ঞাসা করে না!

আশা করি এই প্রশ্নটি বোধগম্য হয়েছে: বাদামের শেলের মধ্যে - কেন $.getJSONক্যাশেড ডেটা পাচ্ছেন? এবং কেন এটি কেবল আই 8 কে প্রভাবিত করছে?


আশ্চর্যের বিষয়, আমি এই বাগটি কেবল আইই নয়, ফায়ারফক্সেও দেখতে পাচ্ছি। জ্যাকুরিতে এজাক্স ক্যাচিং অক্ষম করা আমাকে সহায়তা করেছিল।
জোসেফ সাবল

উত্তর:


67

কেবল আপনাকে জানাতেই ফায়ারফক্স এবং ক্রোম সমস্ত অ্যাজাক্স অনুরোধটিকে অ-ক্যাশেবল হিসাবে বিবেচনা করে। IE (সমস্ত সংস্করণ) অ্যাজাক্স কলকে অন্য ওয়েব অনুরোধের মতোই আচরণ করে। এজন্য আপনি এই আচরণটি দেখেন।
প্রতি অনুরোধে কীভাবে আইই তথ্য ডাউনলোড করতে বাধ্য করবেন:

  • আপনি যেমন বলেছিলেন, JQuery এ 'ক্যাশে' বা 'nocache' বিকল্পটি ব্যবহার করুন
  • অনুরোধে একটি এলোমেলো প্যারামিটার যুক্ত করুন (কুরুচিপূর্ণ, তবে কাজ করে :))
  • সার্ভারের পাশে, গতিবিধি সেট করুন (উদাহরণস্বরূপ কোনও বৈশিষ্ট্য ব্যবহার করে, নীচে দেখুন)

কোড:

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

1
এই সমাধানটি আমার কাছে আবেদন করে। আমি সত্যিই এমভিসিতে একটি অ্যাটিটবুট প্রয়োগের কমনীয়তা পছন্দ করি
অ্যান্ড্রু হ্যারি

1
আজকাল একটি আউটপুটক্যাচিট্রিবিউট ওওটিবি রয়েছে।
bzlm

1
@ বিজেএলএম তবে এটি সন্ধান করা আরও সহজ
সাইমন_উইভার

খুঁজে বার করো formatinternet.wordpress.com/2010/01/14/... একটি ক্লায়েন্ট সাইড সমাধান জন্য
ইভো

1
প্রকৃতপক্ষে, এটি অন্যভাবে, তবে আমি বিকাশকারী হিসাবে স্বীকার করি আইই এর ধৈর্য প্রয়োজন :)
নিকো

107

এটি আমার পক্ষে এভাবে কাজ করেছিল ...

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

আমি এই সমস্যার সাথে লড়াই করে যাচ্ছিলাম এবং আপনার সমাধান এটি সমাধানের একটি দ্রুত উপায় দিয়েছে। :) আমার একটি প্রশ্ন আছে, আপনি কি জানেন যে $ .JaxSetup এর জন্য কোন বিকল্পগুলি ব্যবহার করা যেতে পারে? jQuery ডকুমেন্টেশন দুর্ভাগ্যক্রমে বিশদ সরবরাহ করে না ...
আচিমনল

1
উপলব্ধ অপশন .ajax দেখুন $ অভিন্ন docs.jquery.com/Ajax/jQuery.ajax#options আরও তথ্যের জন্য
ড্যান মধ্যে Esparza

12
উপরের কোডটির জন্য একটি সামান্য সতর্কতা - এতে রেসের শর্ত রয়েছে। কল এবং এর প্রতিক্রিয়া অবিচ্ছিন্ন হওয়ায় আপনার কল কলব্যাকের মধ্যে না $.ajaxSetup({ cache: true });পরে ডান দিকে কল করা উচিত getJSON()
স্যাক্স

16

আপনার উত্তরের জন্য কেন্ট ধন্যবাদ Aj .জ্যাক্স ('{ক্যাশে: না;') ব্যবহার করে; পুরোপুরি কাজ। [সম্পাদনা]

বা কমপক্ষে আমি ভেবেছিলাম আমি করেছি। দেখে মনে হচ্ছে যে jquery $ .getJSON $ .ajax অবজেক্টে করা কোনও পরিবর্তন পড়ছে না।

সমাধানটি যে কাজটি শেষ করেছিল তা হ'ল ম্যানুয়ালি একটি নতুন প্যারামিটার যুক্ত করা

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

তারিখের রেজোলিউশনটি কেবলমাত্র মিনিটে; যার কার্যকরভাবে এই সমাধানটি এখনও এক মিনিট পর্যন্ত ক্যাশে করে means এটি আমার উদ্দেশ্যে গ্রহণযোগ্য।


9
var noCache = নতুন তারিখ ()। getTime (); // আপনাকে এমএস
স্কানলিফ দিবে

ধন্যবাদ স্কানলিফ! - আমি জাভাস্ক্রিপ্টে বেশ নতুন, এএসপি এমভিসি আমার জন্য নতুন দিগন্ত উন্মোচন করেছে
অ্যান্ড্রু হ্যারি

আপনি ম্যাথ.র্যান্ডম () এর মতোও কিছু চেষ্টা করতে পারেন।
ফালকায়েন

@ ফ্যালকায়েন - শক্ত Math.Random()ব্যবহার করা যেতে পারে, এর ফলাফলগুলি অজানা এবং আপনি একই সংখ্যক পর পর দুবার (বা আরও বেশি) পেতে পারেন। new Date().getTime()এটি কখনই পুনরাবৃত্তি না হয় তা নিশ্চিত করে using (যদি আপনি সময়মতো ফিরে যেতে সক্ষম না হন;))
ডেমেন্টিক

11

আমি নিয়ামকটিতে অ্যাকশনটিতে নিম্নলিখিত বৈশিষ্ট্যটি রেখে এই একই সমস্যার সমাধান করেছি:

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

চমৎকার! বিকল্প আছে দুর্দান্ত (আমি এটি একটি বেছে নিয়েছি)। সকল অবদানকারীকে ধন্যবাদ!
এন্ডার্স জুল

Asp.Net MVC 4.0
মায়াঙ্ক

4

আপনি যদি এএসপি নেটওয়ার এমভিসি ব্যবহার করে থাকেন তবে সহজেই এর মতো কোনও ক্যাশে প্রয়োগ করার জন্য একটি এক্সটেনশন পদ্ধতি যুক্ত করার বিষয়টি বিবেচনা করুন:

    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");
    }

ভাল ধারণা - তাই আপনি কলব্যাকের সময় সার্ভারে এই এক্সটেনশন পদ্ধতিটি কল করবেন?
গাই

2

আপনাকে ক্যাশে-ব্রেকার প্রেরণের দরকার হতে পারে।

আমি case .জ্যাক্স ({ক্যাশে: না}) কেবলমাত্র ক্ষেত্রে ব্যবহার করার পরামর্শ দেব (প্রাপ্তির অনুরোধে একটি এলোমেলো প্রত্যয় যুক্ত করুন)

(আমি আজকাল যেকোন জায়গায় aj .জ্যাক্স ব্যবহার করি, আরও টিউনিয়েবল)


আপনার উত্তরের জন্য ধন্যবাদ! ... আমি এখনও এটি চেষ্টা করে দেখিনি। শীঘ্রই ফিড ফিরিয়ে দেবে
অ্যান্ড্রু হ্যারি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.