【问题】:
    自己写好的ascx用户控件,设置了缓存,拖到网页引用,第一次加载没有问题,可以访问用户控件里面的方法;第二此加载的时候用户控件失效。
【原因】:
    第一次加载可以直接对用户控件操作,所以程序不报错;第二词加载的时候,用户已经不存在(被缓存了),所以无法直接引用用户控件的方法。
【解决方法】:
     网上说:可以使用StaticPartialCachingControl来解决。但是msdn上没有具体的code,郁闷。请大家出手。
我的代码:
---------------------------------
Hashtable hash1 = new Hashtable();//UC中方法1
Hashtable hash2 = new Hashtable();//UC中方法2
Hashtable hash3 = new Hashtable();//UC中方法3 if ((WOS.ASCX.OrderForm)this.FindControl("OrderForm1") != null)//如果不是第一次加载
{
hash1 = ((WOS.ASCX.OrderForm)this.FindControl("OrderForm1")).returnTXTHash();
hash2 = ((WOS.ASCX.OrderForm)this.FindControl("OrderForm1")).returnDDLHash();
hash3 = ((WOS.ASCX.OrderForm)this.FindControl("OrderForm1")).SalesOrderHed();
}
else//从缓存中读取,【这段代码有错误】
{
UCOrderForm=(WOS.ASCX.OrderForm)(StaticPartialCachingControl.BuildCachedControl().CachedControl;
hash1 = UCOrderForm.returnTXTHash();
hash2 = UCOrderForm.returnDDLHash();
hash3 = UCOrderForm.SalesOrderHed();
}
----------------------
感谢大家关注。

解决方案 »

  1.   

    check out (for dynamic controls, but the idea should be similar)http://www.aspnetpro.com/NewsletterArticle/2003/08/asp200308pj_l/asp200308pj_l.asp
      

  2.   

    思归好,我看过上面那个地址的文章和您以前恢复的一篇帖子(题目和这个类似,不过是动态加载控件的)。
    因设计到一些具体的事情,该控件必须静态加载。但是StaticPartialCachingControlFindControl的使用网上都没有例子,它不能象PartialCachingControl一样用。
    请您关注。
      

  3.   

    看上去,使用静态UserControl是无法取回原来的控件的建议:
    1。使用动态装载
    2。把你的控件设成类似
    <%@ OutputCache Duration="5" varybycontrol="txt"%>3。把那些控件里的编码移动到其他类去
      

  4.   

    我觉得缓存应该存放一些公用Static的东西,而不是和某id相关联的东西。
      

  5.   

    #region 缓存相关的。
    /// <summary>
    /// 利用工厂模式设置缓存。
    /// </summary>
    /// <param name="key"></param>
    public static System.Data.DataTable setCache(string key)
    {
    System.Data.DataTable dt=new DataTable();
    Type t = Type.GetType("DreamZone.Core.sysCollection");
    MethodInfo method = t.GetMethod(key);
    dt=(System.Data.DataTable)method.Invoke(null,null);
    setCache(key,dt);  
    return dt;
    }
    /// <summary>
    /// 直接利用key和dt设置。
    /// </summary>
    /// <param name="key"></param>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static System.Data.DataTable setCache(string key,System.Data.DataTable dt)
    {
    //HttpContext.Current.Cache.Add(key,dt,null,DateTime.MaxValue,new TimeSpan(0,0,1,0),CacheItemPriority.High,null);
    HttpContext.Current.Cache.Add(key,dt,null,DateTime.MaxValue,new TimeSpan(0,0,1,0),CacheItemPriority.High,null);
    return dt;
    }
    /// <summary>
    /// 从缓存中获取,如果为空设置缓存
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public static System.Data.DataTable getCache(string key)
    {  
    System.Data.DataTable dt=new DataTable();
    if(HttpContext.Current.Cache[key]!=null)
    {
    dt=(System.Data.DataTable)HttpContext.Current.Cache[key];  
    }
    else
    {  
    dt= setCache(key);
    }
     
    return dt;
    }
    /// <summary>
    /// 清空缓存
    /// </summary>
    /// <param name="key"></param>
    public static void clearCache(string key)
    {
    HttpContext.Current.Cache.Remove(key); 
    }
    #endregion