2011-08-11 30 views
6

Tôi có chế độ xem một phần đang được tải vào một phương thức jQuery trong asp.net MVC 3. Vấn đề là chế độ xem không làm mới chính xác. Đây là thứ tự của sự kiện:Mô hình xem một phần MVC Không làm mới

1) Chế độ xem chính có bảng liệt kê các bản ghi sự kiện khác nhau. Có một liên kết trên mỗi hàng của bảng để hiển thị chi tiết sự kiện. 2) Khi liên kết trên bảng này được nhấp, chế độ xem từng phần được tải theo phương thức.

Điều này hoạt động tốt trong một số trường hợp, trong các trường hợp khác, mô hình sẽ mất rất nhiều thời gian để tải. Sau khi đóng chế độ xem/phương thức một phần và nhấp vào một liên kết khác từ bảng trên giao diện chính, chế độ xem một phần sẽ tải hiển thị dữ liệu từ lần tải trước đó. Nó không làm mới chính xác.

Định nghĩa của phương thức trên Main xem: tải, vui lòng chờ ...

<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> 

Bộ điều khiển:

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

Partial View:

<%@ 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> 
    <% } %> 

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

4

Có vẻ như vấn đề về bộ nhớ đệm. Yêu cầu GET có thể được lưu vào bộ nhớ cache bởi một số trình duyệt. Hãy thử thay thế các cuộc gọi $.get AJAX bởi một $.ajax bằng cách thiết lập cache: false hoặc thử một yêu cầu $.post:

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

Ngoài ra bạn không cần phải xóa ModelState trong hành động EventRegistrantSummary của bạn khi bạn không thay đổi bất kỳ giá trị.

+0

Bạn có biết bất kỳ lợi ích nào khi sử dụng phương pháp này so với kiểm soát bộ nhớ đệm tại máy chủ bằng cách sử dụng 'OutputCacheAttribute' trên bộ điều khiển không? –

+0

Nếu bạn sử dụng cuộc gọi ajax được chia sẻ cho nhiều tác vụ hoặc có rất nhiều phương pháp cần phải tránh bộ nhớ cache. Chúng tôi xử lý khoảng 95% tất cả các bài đăng biểu mẫu qua jQuery do điều khiển được cung cấp. – Henry

8

Sử dụng OutputCacheAttribute trên hành động điều khiển của bạn để tắt bộ nhớ đệm.

[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

Không có ý tưởng bạn có thể làm điều đó, luôn luôn sử dụng tùy chọn bộ nhớ cache jQuery/thêm một số ngẫu nhiên vào cuối. Không hữu ích cho cách hiện tại chúng tôi làm những điều nhưng rất tốt để biết. +1. – Henry

+1

Cảm ơn bạn đã đề xuất.Tôi đã thử tùy chọn này trên bộ điều khiển nhưng ngay khi tôi nhấp vào sự kiện/liên kết tiếp theo, màn hình phương thức (xem một phần) tải hiển thị chi tiết sự kiện/liên kết mà tôi đã xem trước đó. – NateReid

+0

Nó hoạt động nhưng trước tiên bạn cần xóa bộ nhớ cache theo cách thủ công. – jgauffin

0

Một cách tiếp cận khác là lấy một số ngẫu nhiên vào chuỗi truy vấn khi bạn đang sử dụng trình trợ giúp MVC đang xây dựng.

Ví dụ:

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

Hoặc cho một hình thức:

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

Không lúc nào cũng là cách tốt nhất để làm điều nhưng nếu bạn muốn tránh gắn thẻ mỗi phương pháp của bạn (Nếu bạn có rất nhiều cần phải tránh các vấn đề về bộ nhớ cache) hoặc sử dụng jQuery để xử lý việc gửi bản thân, đây là một công việc nhanh chóng.

Các vấn đề liên quan