تختلف حسب خصائص التحكم باستخدام PartialCaching في ASP.NET

StackOverflow https://stackoverflow.com/questions/880937

  •  22-08-2019
  •  | 
  •  

سؤال

أنا أستخدم سمة PartialCaching في الفئة الأساسية لعنصر تحكم المستخدم.

أرغب في أن تختلف عناصر التحكم المخزنة مؤقتًا بناءً على الخصائص المعينة في مثيل التحكم.

على سبيل المثال:

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

سيتم تخزين الإخراج مؤقتًا بشكل منفصل عن نسخة التحكم ذات الخصائص المختلفة:

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

.. وسيتم تخزين عنصر التحكم هذا مؤقتًا بشكل منفصل أيضًا:

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

ومع ذلك، إذا كان هناك مثيلين للتحكم في صفحتين منفصلتين تطابق param1 وparam2، أرغب في تخزينهما مؤقتًا ككائن واحد (بحيث تتم مشاركة التحكم المخزن مؤقتًا).

هل يمكن تحقيق حالة الاستخدام المذكورة أعلاه باستخدام سمة PartialCaching؟ما هي الإعدادات التي سأستخدمها؟تختلف عن طريق التحكم؟

أيضًا، هل من الممكن جعل متغير مدة ذاكرة التخزين المؤقت في وقت التشغيل؟

شكرًا.

هل كانت مفيدة؟

المحلول

للإجابة على سؤالك الأول، دعني أخبرك أولاً أن سؤالك نفسه يحتوي على الإجابة؛).""مشتركة""...نعم هذه هي الكلمة الأساسية :) للحصول على مثيل واحد في ذاكرة التخزين المؤقت لتحكم المستخدم عبر جميع الصفحات، قم بتعيين Shared='true' في توجيه @OutputCache.يجب ضبط هذا على مستوى تحكم المستخدم، أي.في صفحة ascx.

للتخزين المؤقت لعنصر تحكم المستخدم استنادًا إلى خصائص عنصر تحكم المستخدم، يجب عليك تحديد الاسم المؤهل بالكامل للخصائص في قسمvariByControls في PartialCachingAttribute.ينبغي فصل الخصائص المتعددة، إن وجدت، بفواصل منقوطة.

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

أو يمكنك أيضًا تضمين سمة PartialCache لتحكم المستخدم:

[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; }

}

أو هناك طريقة أخرى لتخزين عنصر التحكم مؤقتًا في مجموعة القيمتين وهي:

[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); }
    }

}

تحدد المعلمة الأخيرة (صحيح) المشتركة.المدة محددة بـ 60.الرجوع إلى الرابط كيف:تخزين إصدارات متعددة من عنصر تحكم المستخدم مؤقتًا بناءً على المعلمات

للإجابة على سؤالك الثاني، لجعل مدة ذاكرة التخزين المؤقت لمتغير تحكم المستخدم في وقت التشغيل، يمكنك القيام بذلك بطريقتين:

  1. قم بتعيينه في رمز التحكم الخاص بالمستخدم خلف:

    [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. يمكنك تعيينه في الكود الموجود خلف الصفحة حيث تتم الإشارة إلى عنصر تحكم المستخدم باستخدام معرف عنصر تحكم المستخدم.

على سبيل المثالإذا كان عنصر تحكم المستخدم في aspx هو:

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

ثم في الكود الموجود خلف aspx يجب أن تكتب:

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

لمعلوماتك، إذا تم تخزين كل من عنصر تحكم المستخدم والصفحة مؤقتًا:إذا كانت مدة ذاكرة التخزين المؤقت لإخراج الصفحة أقل من مدة تحكم المستخدم، فسيتم تخزين عنصر تحكم المستخدم مؤقتًا حتى انتهاء مدته، حتى بعد إعادة إنشاء بقية الصفحة لطلب.على سبيل المثال، إذا تم تعيين التخزين المؤقت لإخراج الصفحة على 50 ثانية وتم تعيين التخزين المؤقت لإخراج عنصر تحكم المستخدم على 100 ثانية، فستنتهي صلاحية عنصر تحكم المستخدم مرة واحدة لكل مرتين تنتهي صلاحية بقية الصفحة.

نصائح أخرى

أقوم بنشر إجابة جديدة على هذا السؤال القديم جدًا لأن الإجابة المقبولة غير دقيقة على الإطلاق.هذه الإجابة الصحيحة هي:

  • لا توجد طريقة مدمجة للتغيير حسب قيمة خاصية التحكم.VaryByControl يعمل فقط مع عناصر التحكم.
  • عند تقديم نسخة مخبأة، سيكون حقل التحكم الخاص بك خاليًا.لا يمكنك تغيير مدة ذاكرة التخزين المؤقت في الكود - سوف تحصل على NullReferenceException.
  • يوجد خطأ يغير ذاكرة التخزين المؤقت حسب معرف التحكم ومعرف (معرفات) NamingContainer إذا تم تعيين VaryByControl على أي قيمة.ولهذا السبب يبدو أنه يعمل في بعض الأحيان.الخلل موجود هنا: http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/PartialCachingControl.cs#530

لقد قمت بالتدوين عن هذا مؤخرًا هنا: http://tabeokatech.blogspot.be/2014/09/outputcache-on-user-controls.html .

إحدى الطرق التي يمكنك من خلالها إنجاز هذا العمل هي استدعاء أسلوب الإنشاء لـ PartialCachingControl بنفسك في الكود الخلفي، وتضمين قيمة الخاصية التي تريد أن تختلف بها في المعلمة 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;
        };
    }

وهذا يعتني بدقة بمدة التخزين المؤقت المتفاوتة في الكود الخلفي أيضًا.تأكد من إزالة توجيه OutputCache من العلامات الموجودة في ascx عند القيام بذلك.وإلا فإن LoadControl يمنحك PartialCachingControl آخر ويفشل الإرسال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top