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 = 93
和Type = GraphData
,另一个可能是GameID = 41
和Type = 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
.
从输出缓存中检索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)
归档时间: |
|
查看次数: |
4857 次 |
最近记录: |