2011-08-11 119 views
6

我有一個部分視圖,它正在加載到asp.net MVC 3中的jQuery模態。問題是視圖不能正確刷新。這裏是事件的順序:MVC部分視圖模型不刷新

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

聽起來像是一個緩存問題。 GET請求可以被某些瀏覽器緩存。試圖通過將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); 
    } 
}); 

而且你並不需要清除的ModelState在EventRegistrantSummary行動,你不修改任何值。

+0

您知道使用此方法與使用控制器上的OutputCacheAttribute控制服務器上的緩存有什麼好處嗎? –

+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

另一種方法是在您使用in build MVC helper的同時爲查詢字符串附加一個隨機數。

例如:

@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自己處理提交,這是一個快速的解決方法。