ASP.net如何在控件公共属性上输出缓存webusercontrol

Tom*_*len 5 c# asp.net caching outputcache iis-7.5

我有一个Web用户控件,它提供一些潜在的密集数据计算,我希望它被输出缓存,以便每个页面视图不会重新计算数据.它驻留在经常查看的页面上,因此我认为它正常工作非常重要!

对于上下文,它在我们的街机上使用:http: //www.scirra.com/arcade/action/93/8-bits-runner

单击统计信息,将从此webusercontrol生成图形和统计数据.

控制的开始如下:

public partial class Controls_Arcade_Data_ArcadeChartData : System.Web.UI.UserControl
{
    public int GameID { get; set; }
    public Arcade.ChartDataType.ChartType Type { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
Run Code Online (Sandbox Code Playgroud)

现在我遇到的困难是输出缓存需要依赖于GamID和ChartType.

这个控件重复使用GameID和类型的许多不同组合,我需要它为每个组件创建一个缓存,但我很难找到如何做到这一点.

例如,一个街机游戏可能传递GameID = 93Type = GraphData,另一个可能是GameID = 41Type = TotalPlaysData而另一个可能是GameID = 93,但Type = TotalPlaysData.这些都应该返回不同的数据并具有不同的输出缓存.

该控件用于游戏页面,类似于此(参数实际上是在代码隐藏中设置的)

<div>Total Plays:</div>
<div class="count"><Scirra:ArcadeChartData runat="server" GameID="93" Type="TotalPlays" /></div>
<br /><br />
<div>Total Guest Plays:</div>
<div class="count"><Scirra:ArcadeChartData runat="server" GameID="93" Type="TotalGuestPlays" /></div>

etc.
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏!我花了一段时间在网上看,它一直是我需要解决的东西,但无法想象这一点.

编辑

编辑:我已尝试将此行添加到我的控件中:<%@ OutputCache Duration ="20"VaryByControl ="GameID; Type"%>

但它只是在使用控件在ASPX页面上第一次设置Object reference not set to an instance of an object.的行上抛出错误GameID.

Ric*_*kNZ 9

从输出缓存中检索Control时,它不会被实例化为您可以操作的实例; 您只需获得Control生成的输出,而不是Control本身.例如,正如您在问题中所述,您无法从后面的代码设置缓存控件的属性.应该以声明方式设置vary-by属性(使用ExpressionBuilder也可以工作,尽管我还没有尝试过).

要在代码中查看是否已从输出缓存中检索到控件,请检查null:

if (this.YourControlID != null) // true if not from cache
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

即使有这个警告,控制输出缓存有点古怪.

试试这个:

<%@ OutputCache Duration="20" VaryByControl="GameID;Type" Shared="true" %>
Run Code Online (Sandbox Code Playgroud)

Control的输出通过将其与某个键相关联而存储在输出缓存中.使用时Shared="true",缓存键是所有指定属性的值以及Control的ID.如果没有Shared="true",缓存键也包含页面类型,因此输出会因Page而异 - 这听起来不像你想要的那样.

如果您在多个页面上使用Control,请确保在每个页面上使用相同的ID,因为ID包含在输出缓存的键的一部分中.如果您不能或不使用不同的ID,您将在缓存中为每个唯一ID获取Control的输出的新副本.如果具有不同ID的控件总是具有不同的属性值,那么这可能不是问题.

作为OutputCache指令的替代,您可以在类声明上设置一个属性:

[PartialCaching(20, null, "GameID;Type", null, true)]
public partial class Controls_Arcade_Data_ArcadeChartData : UserControl
Run Code Online (Sandbox Code Playgroud)

  • 可以在同一页面上使用不同的ID; 请记住,ID是缓存键的一部分,因此可以获得相同输出的多个副本.如果总是根据页面上控件的位置设置Type,就像在问题中一样,这可能不是问题. (2认同)