在我提出这个问题之前,让我先介绍一下背景。我正在尝试开发一种自定义缓存机制,我可以将其应用于自定义构建的用户控件。 (请注意,我知道.NET中有一些内置的缓存机制)根据在标记中以声明方式设置的某些标志,控件应加载其先前呈现的内容的缓存版本或正常执行(如果某些标志设置它应该生成其内容的缓存,以便下次加载)。我希望能够在标记中以声明方式传递某些标志,并能够在Page Init处检查它们的值,并根据标志值确定控件是否应加载缓存版本。
<uc:MyUC ID="N1" runat="server"
CacheProp='<%# SomeEnum.A | SomeEnum.B |SomeEnum.C %>'
PropA='<%# this.SomePropA %>'
PropB='<%# (this.SomePropB %>'
PropC='<%# this.SomePropC %>'
/>
我面临的问题是,据我所知,如果我调用DataBind(),我只能获得在标记中声明性地分配的属性的值。但是我面临两个问题:
首先从this.DataBind()
内调用MyUC
将触发所有子控件的绑定,这会破坏缓存的目的;还构建了所有用户控件,以便在DataBind()
事件触发之前不会调用LoadComplete
,因此要确保它们所在的父控件已完成初始化并计算了属性声明性地传递给子用户控件(即PropA
,PropB
,PropC
)。
现在的问题是:有没有办法绑定CacheProp
属性,以便在不绑定所有其他属性的情况下检索其值而不触发所有子控件的数据绑定?
感谢您的帮助!
朱塞佩
答案 0 :(得分:0)
这应该有效:
<uc:MyUC ID="N1" runat="server" CacheProp="A|B|C"... >
代码背后:
strRawValue = N1.Attributes["CacheProp"];
string[] arrValues = strRawValue.Split('|');
SomeEnum value = (SomeEnum)Enum.Parse(typeof(SomeEnum), arrValues[0]);
for (int i = 1; i < arrValues.Length; i++)
value |= (SomeEnum)Enum.Parse(typeof(SomeEnum), arrValues[i]);