2011-08-11 11 views
6

मेरे पास आंशिक दृश्य है जिसे एएसपीनेट एमवीसी 3 में एक jQuery मोडल में लोड किया जा रहा है। समस्या यह है कि दृश्य ठीक से रीफ्रेश नहीं कर रहा है। यहां घटनाओं का क्रम दिया गया है:एमवीसी आंशिक दृश्य मॉडल ताज़ा नहीं

1) मुख्य दृश्य में विभिन्न ईवेंट रिकॉर्ड सूचीबद्ध करने वाली तालिका है। घटना विवरण दिखाने के लिए तालिका की प्रत्येक पंक्ति पर एक लिंक है। 2) जब इस तालिका पर लिंक क्लिक किया जाता है, तो आंशिक दृश्य मोडल में लोड होता है।

यह कुछ मामलों में ठीक काम करता है, अन्य मामलों में मॉडल को लोड करने में बहुत लंबा समय लगेगा। आंशिक दृश्य/मोडल बंद करने और मुख्य दृश्य पर तालिका से दूसरे लिंक पर क्लिक करने के बाद, आंशिक दृश्य पिछले लोड से डेटा दिखाएगा लोड करेगा। यह सही ढंग से ताज़ा नहीं है। मुख्य दृश्य पर मॉडल की

परिभाषा: लोड हो रहा है, कृपया प्रतीक्षा करें ...

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#EventRegistrantSummary").dialog({ 
      bgiframe: true, autoOpen: false, height: 500, width: 980, resizable: false, modal: true 
     }); 
    }); 
    function showEventRegistrantSummary(id) { 
     $.get("/Event/EventRegistrantSummary/" + id, function (data) { 
      $("#EventRegistrantSummary").html(data); 
     }); 
     $("#EventRegistrantSummary").dialog('open'); return false; 
    } 
</script> 

नियंत्रक:

public PartialViewResult EventRegistrantSummary(Guid id) 
    { 
     ModelState.Clear(); 
     Event e = db.Events.Single(ev => ev.ID == id); 
     return PartialView(e); 
    } 

आंशिक दृश्य:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<model.Event>" %> 
<% using (Ajax.BeginForm("EditUpdate", new AjaxOptions { UpdateTargetId="Target", InsertionMode= InsertionMode.Replace})) 
     {%> 

     <h6 style="text-align:center">Registration Summary: <%= Model.Name %></h6> 

     <div style="float:left;width:35%"> 
      <fieldset id="Overview"> 
       <legend>Overview</legend> 
       <div class="editor-label"> 
        Total Registrants: <%= Model.BoatEventRegistrations.Count() %> 
       </div> 
      </fieldset> 
      </div> 
    <% } %> 

किसी भी मदद की बहुत सराहना की है।

उत्तर

4

कैशिंग मुद्दे की तरह लगता है। अनुरोध प्राप्त करें कुछ ब्राउज़रों द्वारा कैश किया जा सकता है। cache: false स्थापना करके एक $.ajax द्वारा $.get AJAX कॉल के बजाय ऐसे या एक $.post अनुरोध के लिए प्रयास:

$.ajax({ 
    url: '<%= Url.Action("EventRegistrantSummary", "Event") %>', 
    type: 'GET', 
    cache: false, 
    data: { id: id }, 
    success: function(data) { 
     $('#EventRegistrantSummary').html(data); 
    } 
}); 

इसके अलावा, आप अपने EventRegistrantSummary कार्रवाई में ModelState साफ़ करने से कोई भी मान को संशोधित नहीं कर रहे हैं के रूप में की जरूरत नहीं है।

+0

क्या आप नियंत्रक पर 'आउटपुट कैशएट्रिब्यूट' का उपयोग कर सर्वर पर कैशिंग को नियंत्रित करने के इस विधि का उपयोग करने के किसी भी लाभ से अवगत हैं? –

+0

यदि आप एकाधिक क्रियाओं के लिए साझा AJAX कॉल का उपयोग करते हैं या कैश से बचने के लिए बहुत सी विधियां हैं। हम दिए गए नियंत्रण के कारण jQuery के माध्यम से सभी फॉर्म पोस्टों का लगभग 95% संभालते हैं। – Henry

8

कैशिंग अक्षम करने के लिए अपने नियंत्रक कार्रवाई पर OutputCacheAttribute का उपयोग करें।

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public PartialViewResult EventRegistrantSummary(Guid id) 
{ 
    ModelState.Clear(); 
    Event e = db.Events.Single(ev => ev.ID == id); 
    return PartialView(e); 
} 
+0

कोई विचार नहीं था कि आप ऐसा कर सकते हैं, हमेशा jQuerys कैश विकल्प का उपयोग करते हैं/अंत में एक यादृच्छिक संख्या जोड़ते हैं। मौजूदा तरीके से उपयोगी नहीं है जो हम चीजें करते हैं लेकिन जानना बहुत अच्छा है। +1। – Henry

+1

सुझाव के लिए धन्यवाद।मैंने नियंत्रक पर इस विकल्प की कोशिश की लेकिन जैसे ही मैं अगली घटना/लिंक पर क्लिक करता हूं, मोडल स्क्रीन (आंशिक दृश्य) लोड करता है जो मैंने पहले देखा था ईवेंट/लिंक विवरण दिखा रहा है। – NateReid

+0

यह काम करता है लेकिन आपको पहले कैश को मैन्युअल रूप से साफ़ करने की आवश्यकता है। – jgauffin

0

एक और दृष्टिकोण के रूप में आप में MVC सहायकों का निर्माण का उपयोग कर रहे क्वेरी स्ट्रिंग के लिए एक यादृच्छिक संख्या attatch है।

उदाहरण के लिए:

@Ajax.ActionLink("LinkText", "Index", "Home", new { rnd = DateTime.Now.Ticks }, new AjaxOptions { UpdateTargetId = "main", OnSuccess = "pageloadSuccess" }) 

या एक फार्म के लिए:

using (Ajax.BeginForm("EditUpdate", new { rnd = DateTime.Now.Ticks }, new AjaxOptions { UpdateTargetId="Target", InsertionMode= InsertionMode.Replace})) 

नहीं हमेशा चीज़ों लेकिन यदि आप अपने तरीकों में से प्रत्येक टैगिंग (आप बहुत कुछ है, तो बचना चाहते हैं करने के लिए सबसे अच्छा तरीका है जिसे कैश की समस्याओं से बचने की आवश्यकता है) या स्वयं को जमा करने के लिए jQuery का उपयोग करके यह एक त्वरित काम है।

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