2009-05-19 33 views
11

Tôi đang sử dụng thuộc tính PartialCaching trên lớp cơ sở của điều khiển người dùng.Thay đổi bởi các thuộc tính điều khiển bằng cách sử dụng PartialCaching trong ASP.NET

Tôi muốn các điều khiển được lưu trong bộ nhớ cache thay đổi dựa trên các thuộc tính được đặt trên đối tượng điều khiển.

Ví dụ:

<mycontrols:control1 runat="server" param1="10" param2="20" /> 

... đầu ra sẽ được lưu trữ riêng biệt từ một trường hợp kiểm soát với những đặc tính khác nhau:

<mycontrols:control1 runat="server" param1="15" param2="20" /> 

... và kiểm soát này sẽ được lưu trữ riêng biệt cũng như:

<mycontrols:control1 runat="server" param1="10" param2="25" /> 

Tuy nhiên, nếu hai trường hợp kiểm soát trên hai trang riêng biệt có giống hệt nhau thuộc tính param1 và param2, tôi muốn chúng lưu vào bộ nhớ cache dưới dạng một đối tượng (để kiểm soát bộ nhớ cache được chia sẻ).

Trường hợp sử dụng ở trên có thể đạt được với thuộc tính PartialCaching không? Tôi sẽ sử dụng cài đặt nào? varyByControl?

Ngoài ra, có thể tạo biến thời lượng bộ nhớ cache trong thời gian chạy không?

Cảm ơn.

Trả lời

22

Để trả lời câu hỏi đầu tiên của bạn, trước tiên hãy để tôi cho bạn biết rằng câu hỏi của bạn có câu trả lời;). 'Chia sẻ' ... có đó là từ khóa :) Để có một cá thể trong bộ nhớ cache để người dùng kiểm soát trên tất cả các trang, hãy đặt Shared = 'true' trong chỉ thị @OutputCache. Điều này sẽ được đặt ở cấp độ kiểm soát của người dùng, ví dụ: trong trang ascx.

Để bộ nhớ cache điều khiển người dùng dựa trên thuộc tính kiểm soát người dùng, bạn nên chỉ định tên đầy đủ của thuộc tính trong phần varyByControls của PartialCachingAttribute. Nhiều thuộc tính nếu có nên được phân tách bằng dấu chấm phẩy.

<%@ Control Language="C#" AutoEventWireup="true" 
CodeFile="WebUserControl.ascx.cs" 
Inherits="UC_WebUserControl" %> 
<%@ OutputCache Duration="60" 
VaryByControl="UC_WebUserControl.param1;UC_WebUserControl.param2" 
VaryByParam="none" Shared="true" %> 

hoặc bạn cũng có thể bao gồm các thuộc tính PartialCache cho người dùng điều khiển:

[PartialCaching(60, null, "UC_WebUserControl.param1;UC_WebUserControl.param2", null, true)] 
public partial class UC_WebUserControl : System.Web.UI.UserControl 
{ 
    public string param1 { get; set; } 
    public string param2 { get; set; } 

} 

HOẶC một cách khác để bộ nhớ cache kiểm soát trên sự kết hợp của cả hai giá trị sẽ là:

[PartialCaching(60, null, "UC_WebUserControl.BothParams", null, true)] 
public partial class UC_WebUserControl : System.Web.UI.UserControl 
{ 
    public string param1 { get; set; } 
    public string param2 { get; set; } 

    public string BothParams  
    { 
     get { return String.Concat(param1, param2); } 
    } 

} 

Tham số cuối cùng (đúng) chỉ định chia sẻ. Thời gian được xác định bởi 60. Tham khảo các liên kết How to: Cache Multiple Versions of a User Control Based on Parameters

Để trả lời câu thứ hai Q của bạn, để làm trong suốt thời gian bộ nhớ cache cho biến điều khiển người dùng tại thời gian chạy, bạn có thể làm điều đó trong hai cách:

  1. gán nó trong các mã điều khiển người dùng sau:

    [PartialCaching(60, null, "UC_WebUserControl.BothParams", null, true)] 
    public partial class WebUserControl1 : System.Web.UI.UserControl 
    { 
        ... 
        protected void Page_Load(object sender, EventArgs e) 
        { 
         this.CachePolicy.Duration = new TimeSpan(0, 0, 60); 
        }  
    }
  2. Bạn có thể gán nó trong mã phía sau của trang nơi điều khiển người dùng được tham chiếu bằng cách sử dụng ID của điều khiển người dùng.

ví dụ: Nếu điều khiển người dùng trên aspx là:

<mycontrols:control1 ID="ucControl1" runat="server" param1="15" param2="20" /> 

sau đó trong mã phía sau của aspx, bạn nên viết:

this.ucControl1.CachePolicy.Duration = new TimeSpan(0, 0, 60); 

FYI, nếu cả hai người dùng điều khiển và trang được cache: Nếu trang thời lượng bộ nhớ cache đầu ra nhỏ hơn thời gian của điều khiển người dùng, điều khiển người dùng sẽ được lưu vào bộ nhớ cache cho đến khi hết hạn, ngay cả sau khi phần còn lại của trang được tạo lại cho yêu cầu. Ví dụ, nếu bộ đệm đầu ra của trang được đặt thành 50 giây và bộ nhớ đệm đầu ra của điều khiển người dùng được đặt thành 100 giây, điều khiển người dùng hết hạn một lần cho mỗi hai lần phần còn lại của trang hết hạn.

+0

Response.Cache dành cho bộ đệm ẩn cấp trang. Tôi quan tâm đến bộ nhớ đệm mức điều khiển bằng cách sử dụng thuộc tính PartialCaching. – frankadelic

+0

Có quan điểm của bạn ... Tôi đã chỉnh sửa phản hồi tương ứng :) –

+0

Ngoài ra, ví dụ của bạn [PartialCaching (60, "param1", null, null, true)] ... điều này sẽ thay đổi dựa trên QueryString "param1" hoặc Tham số POST. Đó không phải là điều tôi muốn. "Tôi muốn các điều khiển được lưu trong bộ nhớ cache thay đổi dựa trên các thuộc tính được đặt trên cá thể điều khiển". – frankadelic

1

Tôi đang đăng câu trả lời mới cho câu hỏi rất cũ này vì câu trả lời được chấp nhận là không chính xác. Câu trả lời đúng này là:

  • Không có cách tích hợp để thay đổi theo giá trị thuộc tính kiểm soát. VaryByControl chỉ hoạt động cho các điều khiển.
  • Khi phiên bản được lưu trong bộ nhớ cache được phân phát, trường điều khiển của bạn sẽ không có giá trị. Bạn không thể thay đổi thời lượng bộ nhớ cache trong mã - bạn sẽ nhận được một NullReferenceException.
  • Có lỗi thay đổi bộ nhớ cache bằng ID kiểm soát và ID của NamingContainer nếu VaryByControl được đặt thành bất kỳ giá trị nào. Đó là lý do tại sao nó xuất hiện để làm việc đôi khi. Lỗi này nằm ngay tại đây: http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/PartialCachingControl.cs#530

Tôi viết blog về điều này gần đây ngay tại đây: http://tabeokatech.blogspot.be/2014/09/outputcache-on-user-controls.html.

Một cách bạn có thể làm công việc này là gọi phương thức xây dựng cho PartialCachingControl mình trong code-behind, và nhúng các giá trị tài sản mà bạn muốn thay đổi tùy theo trong tham số guid:

// PhControls is an asp:PlaceHolder 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     { 
      System.Web.UI.StaticPartialCachingControl.BuildCachedControl(PhControls, String.Format("Test{0}", i), String.Format("1234567{0}", i), 180, null, null, null, null, new System.Web.UI.BuildMethod(GetBuilderDelegate(i)), null); 
     } 
    } 

    public Func<Control> GetBuilderDelegate(int number) 
    { 
     return delegate() 
     { 
      var control = (UserControls.Test)LoadControl("~/UserControls/Test.ascx"); 
      control.Number = number; 
      return control; 
     }; 
    } 

Đó gọn gàng mất chăm sóc thời lượng bộ nhớ đệm khác nhau trong mã-đằng sau là tốt. Hãy chắc chắn rằng bạn loại bỏ các chỉ thị OutputCache từ đánh dấu trong ascx mặc dù khi bạn làm điều này. Nếu không LoadControl sẽ cho bạn một PartialCachingControl khác và cast không thành công.

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