gpt4 book ai didi

c# - ASP.net 如何在控件公共(public)属性上输出缓存 webusercontrol

转载 作者:太空狗 更新时间:2023-10-29 22:12:42 25 4
gpt4 key购买 nike

我有一个 Web 用户控件,它提供一些潜在的密集型数据计算,我希望将其输出缓存,以便每个页面 View 都不会重新计算数据。它驻留在非常频繁查看的页面上,因此让它正常工作非常重要!

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

点击 stats,图形和统计数据从这个 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)
{

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

这个控件被许多不同的 GameID 和类型组合重复使用,我需要它为每个组合创建一个缓存,但我正在努力寻找如何做到这一点。

例如,一个街机游戏可能传入 GameID = 93Type = GraphData,另一个可能是 GameID = 41Type = TotalPlaysData 和另一个可能是 GameID = 93Type = 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.

感谢任何帮助!我花了一段时间在网上查看,它一直作为我需要解决的问题出现,但无法解决这个问题。

编辑

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

但它只是抛出错误 Object reference not set to an instance of an object.GameID as being first seted on the ASPX page使用控件。

最佳答案

当从输出缓存中检索到控件时,它不会实例化为您可以操作的实例;你只是得到控制生成的输出,而不是控制本身。例如,您不能像您在问题中所说的那样从代码后面设置缓存控件的属性。 vary-by 属性应该以声明方式设置(使用 ExpressionBuilder 也可能有效,但我还没有尝试过)。

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

if (this.YourControlID != null) // true if not from cache
{
// do stuff
}

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

试试这个:

<%@ OutputCache Duration="20" VaryByControl="GameID;Type" Shared="true" %>

控件的输出通过与某个键相关联而存储在输出缓存中。对于 Shared="true",缓存键是所有指定属性的值以及控件的 ID。如果没有 Shared="true",缓存键还包括页面类型,因此输出会因页面而异——这听起来不像您想要的那样。

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

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

[PartialCaching(20, null, "GameID;Type", null, true)]
public partial class Controls_Arcade_Data_ArcadeChartData : UserControl

关于c# - ASP.net 如何在控件公共(public)属性上输出缓存 webusercontrol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com