加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用webusercontrol获取输出缓存以在ASP.net中工作

发布时间:2020-12-16 09:54:38 所属栏目:asp.Net 来源:网络整理
导读:我有一个带有公共int属性SelectedCatID的webusercontrol.我在其他页面和其他控件中使用此控件,如下所示: NewStore:LeftMenuLinks runat="server" SelectedCatID="%#CatIDToSelect%" / 如何根据SelectedCatID输出缓存此控件?我尝试过的一切都失败了. 我得到
我有一个带有公共int属性SelectedCatID的webusercontrol.我在其他页面和其他控件中使用此控件,如下所示:

<NewStore:LeftMenuLinks runat="server" SelectedCatID="<%#CatIDToSelect%>" />

如何根据SelectedCatID输出缓存此控件?我尝试过的一切都失败了.

我得到的最接近的是让它进行缓存,但它在SelectedCatID上没有变化,只有缓存过期才会选择相同的菜单项.没有缓存,控件按预期工作.

解决方法

我弄清楚为什么你最初使用的VaryByControls方法不起作用.可悲的是你从你的问题中编辑了它,所以我对此的研究只需要进入博客文章.更新:有问题的博文: http://tabeokatech.blogspot.be/2014/09/outputcache-on-user-controls.html.

它的长短不过是VaryByControls是VaryByParams的简写,并且对属性没有任何作用:它只查看POST值.它曾经用于具有静态值的属性这一事实似乎是一个错误–VaryByControls中的任何字符串都会使该部分工作.这个问题的公认答案是错误的:Vary by control properties using PartialCaching in ASP.NET.

没有内置的方法可以根据控件属性值而变化.

这无论如何都没有意义,因为需要创建用户控件以具有属性值,并且您希望避免创建它们,而是缓存其呈现的标记 – 如果为缓存标记提供缓存,则缓存用户控件字段在代码隐藏中为空他们.
这通过将PartialCachingControl注入页面而不是实际的用户控件来工作.此PartialCachingControl检查缓存,仅在没有缓存版本时才创建控件.

至于使它工作,我看到两个选项:

>如果每页只有1个usercontrol,则可以使用VaryByCustom方法.为了简单起见,您可以编写一个返回该页面属性值的接口,并在托管用户控件的每个页面上实现它,例如:

interface INumberProvider
{
    int GetNumber();
}

// and the page:
public partial class _Default : Page,INumberProvider
{
    public int GetNumber()
    {
        return this.SomeNumberPropertyOrWhatever;
    }
...

在Global.asax中,您将当前处理程序转换为INumberProvider并获取数字:

public override string GetVaryByCustomString(HttpContext context,string custom)
    {
        if (custom == "INumberProvider")
        {
            var page = context.CurrentHandler as INumberProvider;

            if (page != null)
            {
                return page.GetNumber().ToString();
            }
        }
        return base.GetVaryByCustomString(context,custom);
    }

在您的控制中,您显然会添加:

OutputCache Duration =“180”VaryByCustom =“INumberProvider”VaryByParam =“None”Shared =“true”

如果每页只有一个用户控件,那应该非常简单.如果每页需要多个用户控件,那么运气不好:>通过编写自定义WebControl,围绕用户控件构建自己的包装器.添加所需的属性,捕获呈现的用户控件的输出,并使用包含SelectedCatID的键将其插入到HttpContext.Current.Cache中.基本上编写自己的自定义PartialCachingControl.还有选项3:>决定缓存毕竟不重要

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读