2012-01-09 18 views
19

में आंशिक दृश्य पर कैशिंग अक्षम करें मुझे आंशिक दृश्य कैश होने पर कोई समस्या नहीं है जब यह नहीं होना चाहिए। यह आंशिक दृश्य किसी पृष्ठ पर लॉगऑन/लॉगऑफ प्रदर्शित करने के लिए उपयोग किया जाता है। यह है, जोएमवीसी 3

@if(Request.IsAuthenticated) {  
    <a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a> 
} 
else { 
    <a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a> 
} 

यह आंशिक देखें मेरी MVC3 आवेदन में सभी पृष्ठों के साथ से कहा जाता है प्रदर्शित करने के लिए लिंक यह पता लगाने के लिए नीचे सरल कोड का उपयोग करता

@Html.Partial("_HeaderView") 

उपयोग करते हुए मेरे नियंत्रकों से अधिकांश में, मेरे पास है आउटपुट कैश परिभाषित किया गया है, इसलिए मैं अपनी सामग्री को कैशिंग का लाभ उठा सकता हूं।

[OutputCache(Duration = 86400, VaryByParam = "*")] 

अब मेरी समस्या यह है कि जब मैं आंशिक दृश्य नहीं चाहता हूं तो पूरा पृष्ठ कैश किया जा रहा है। यह गलत व्यवहार कर रहा है, जहां कभी-कभी लॉगऑफ प्रदर्शित होता है, भले ही उपयोगकर्ता लॉग इन नहीं हो। आदि। प्रश्न में आंशिक दृश्य को छोड़कर, सभी सामग्री को कैश करने का कोई तरीका है?

+0

निक, क्षमा करें, यहां टिप्पणी को जोड़ना पड़ा। वैसे भी, यह काम करता है जब मैं नॉस्टोर को हटाता हूं और अवधि को 1 में बदल देता हूं। उपयोगकर्ता द्वारा लॉग इन करने पर एकमात्र समस्या तब होती है, उन्हें होम पेज पर ले जाया जाता है लेकिन मुझे इसे प्रभावी होने के लिए स्पष्ट रूप से रीफ्रेश करना होगा (लॉगआउट दिखाने के लिए लॉगऑन के बजाय)। – SimpleUser

उत्तर

9

आप के लिए डोनट कैशिंग कहा जाता है क्या देख रहे हैं। यह एक महान लेख है कि यह क्या है और इसे कैसे काम करना है http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3

+0

मैंने इसे आजमाया, लेकिन यह मेरे लिए अपेक्षित काम नहीं करता था। मुझे अभी भी आंशिक कार्रवाई पर आउटपुट कैश विशेषता का उपयोग करने के समान समस्याएं थीं, अर्थात् होम पेज को मैन्युअल रूप से रीफ्रेश करना। – SimpleUser

+0

मुझे मदद करना अच्छा लगेगा, लेकिन आपके पास जो कोड था वह मुश्किल नहीं होगा :) यह मेरे लिए काम करता है। जब आप परीक्षण करते हैं, तो कृपया उचित ब्राउज़र सेटिंग्स के बारे में याद रखें (कभी-कभी वे सर्वर सेटिंग्स को ओवरराइड करते हैं, और मामला झूठी छाप कुछ काम नहीं करता है) – torm

+0

नहीं, यह सिर्फ मुझे वास्तव में धीमा पल था। एक फ्लू के साथ काम करना स्पष्ट रूप से एक अच्छा विचार नहीं है। लेकिन यह अब काम करता है। आपकी मदद के लिए धन्यवाद – SimpleUser

18

आप नियंत्रक जो आपके _HeaderView निम्नलिखित के साथ आंशिक प्रदर्शित करता है सजाने द्वारा कैशिंग निष्क्रिय कर सकते हैं:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult HeaderView() 
{ 
    return PartialView("_HeaderView"); 
} 
+0

हाय निक। आपके सहयोग के लिए धन्यवाद। लेकिन मेरे पास आंशिक दृश्य से जुड़े नियंत्रक कार्रवाई नहीं है (अभी भी वैसे भी)। मैं इसे HTML.Partial() का उपयोग कर कॉल कर रहा हूं। उपर्युक्त के साथ नियंत्रक कार्रवाई करने का एकमात्र कामकाज है? – SimpleUser

+0

हो सकता है कि आप एक साझा नियंत्रक जोड़ सकें और एक हेडर व्यू क्रिया जोड़ें जो PartialView ("_ HeaderView") लौटाता है; और उपरोक्त मेरे उत्तर में एनोटेशन के साथ सजाया गया है। उम्मीद है कि यह आपको वह नियंत्रण देगा जो आपको चाहिए और भारी परिवर्तन नहीं है। मुझे बताएं कि क्या यह आपके लिए काम करता है या आपको अधिक स्पष्टीकरण की आवश्यकता है। – Nick

+0

धन्यवाद निक।मैं परिवर्तनों को लागू करूंगा और आपको बता दूंगा कि यह कैसा चल रहा है। – SimpleUser

3

हमें अनावश्यक कोड से बचने के लिए पृष्ठों में व्यक्तिगत रूप से कैश मान सेट करने के बजाय Web.config फ़ाइल में कैश प्रोफ़ाइल सेट करनी चाहिए। हम OutputCache विशेषता की CacheProfile प्रॉपर्टी का उपयोग करके प्रोफ़ाइल का संदर्भ ले सकते हैं। यह कैश प्रोफाइल सभी पृष्ठों पर लागू नहीं किया जाएगा जब तक कि पृष्ठ/विधि इन सेटिंग्स को ओवरराइड न करे।

<system.web> 
    <caching> 
    <outputCacheSettings> 
     <outputCacheProfiles> 
     <add name="CacheProfile" duration="60" varyByParam="*" /> 
     </outputCacheProfiles> 
    </outputCacheSettings> 
    </caching> 
</system.web> 

और तुम जो रिटर्न आंशिक दृश्य [_HeaderView], आप सजाने द्वारा config कैश सेटिंग्स ओवरराइड कर सकते हैं कि जैसे विशिष्ट कार्रवाई विधि नीचे दिखाया गया है आपकी कार्रवाई से कैशिंग अक्षम करना चाहते हैं:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult RenderPartialView() 
{ 
    return PartialView("_HeaderView"); 
} 

उम्मीद है कि यह आपकी मदद करेगा!

1

मेरे लिए यह काम कर रहे ..

public ActionResult LogOff() 
{ 
    AuthenticationManager.SignOut(); 
    var url = Url.Action("Index", "Web"); 
    HttpResponse.RemoveOutputCacheItem(url);   
    return RedirectToAction("Index", "Web"); 
} 
+0

+1 मैंने अन्य सभी समाधानों की कोशिश की, उन्होंने अच्छी तरह से काम नहीं किया, यह मेरे लिए एक आकर्षण की तरह काम करता था ... धन्यवाद :) नोट: मुझे प्रमाणीकरण प्रबंधक का उपयोग करने की आवश्यकता नहीं है। साइनआउट() .; –

0

थोड़ी देर लिया MVC में वापस जाने के बाद यह एक यह पता लगाने की। केवल आंशिक शीर्षलेख दृश्य में सीधे कैश सेटिंग डालें। उपयोगकर्ता नाम प्रदर्शित करते समय। वैश्विक या सर्वर-साइड कोड की कोई आवश्यकता नहीं है। पृष्ठ को कैश किए जाने पर ही समस्या होती है, यह लॉगिन के तुरंत बाद रीफ्रेश नहीं होगा। लेकिन जब उत्पादों के लिए प्रारंभिक ब्राउज़िंग में आवश्यकता होती है तो हम गति को बनाए रखते हैं। ठीक है हमारे मामले में व्यापार।

 

    @if (Request.IsAuthenticated) 
    { 
      @* when we are authenticated, don't cache any more! *@ 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    HttpContext.Current.Response.Cache.SetNoStore(); 
    HttpContext.Current.Response.Cache.SetNoServerCaching(); 
      @*@Html.Raw(DateTime.Now.ToString())*@ 
    @Html.ActionLink("Welcome " + (String.IsNullOrEmpty(((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")) ? User.Identity.Name : ((System.Security.Claims.ClaimsIdentity)User.Identity).FindFirstValue("UserName")), "Index", "Manage", routeValues: new { Area = "Store" }, htmlAttributes: new { title = "Manage"}) 
    } 
    else 
    { 
    }