2010-10-29 20 views
0

我有一个复合控件,它有两个引用缓存中的值的私有字段,这些私有字段在构造方法中调用。由于字符串键用于标识缓存中的值,因此我必须有一种方法来存储该字符串键,使其在控制实例化时可用,并且必须能够引用它没有它改变的回发。如何在不使用视图状态的情况下为复合控件的回传保存值

此外,该按键是在控件第一次加载时生成的,但在第一次之后不应该再次更改。

我该如何做到这一点?

我已经尝试将其保存到视图状态,但这不起作用,因为viewstate在控件实例化时还不可用。

我曾尝试使用私人字段,然后在构造函数中检查Page.IsPostback,如果它不是回发,我给私有字段赋值,但在随后的回发中它失去了它的值,我可以再次将它重新分配给Page.IsPostBack,因为它是自动生成的GUID。

这一定是一些人不得不做之前....

回答

0

没有大量的控制施工过程中可用的状态信息的好,所以这可能是困难的。是否有某些原因导致您无法将访问Cache'ed信息的代码移动到控件的Init事件中?

我假设你不能使用会话,因为存储的信息与特定的请求/回发有关。如果它不是特定的请求,使用会话可能是一种可能性 - 但我认为你可能会遇到其他问题,试图在生命中尽早处理控制状态。


在看到您对其他答案的评论之后;您应该能够将检查缓存数据源的代码移动到控件的Init或甚至Load事件中,以便状态可用。

另外,偶然地;你确定你确实需要缓存这些数据吗?这可能最终会占用大量的服务器内存。

+0

当用户点击复合控件中的“复位”按钮时,我正在使用缓存来将数据重置为原始状态。无论如何,这是它的主要目的..我正在测试试图移动将数据源分配到init事件的代码。 – 2010-10-29 20:16:00

+0

好的;只要你没有在奇怪的时代发生任何其他事情,而这些事情在某个特定的时间依赖于它,那么它就应该起作用。一般来说,数据绑定最好在Load事件(Page或Control)中完成,但我建议至少Init以减少遇到另一个问题的可能性,如果某事取决于您同时正在做的其他事情。 – 2010-10-29 20:19:34

+0

我不想再讨论这个问题了,关于你在缓存/应用程序中存储的内容;但也可能有更好的方法来处理这个问题,这取决于你所存储的内容。 – 2010-10-29 20:20:48

0

你试过Session

您可以在某个特定用户的会话对象中存储任何您喜欢的内容,并在回发之间维护值/对象。

如果你想存储不是每个SER基础上,在全球范围内,并尽量Application

+0

那么,我实际上是将这个控件使用的“数据源”存储在ApplicationCache中。问题是我试图在缓存中唯一标识该数据源,以便控件可以获取它。目前,缓存键由控件的ID,sessionID和数据源的名称(有两个“当前”和“原始”)组成。只要存在控件的页面上只有一个控件,但是如果有第二个控件,它们最终会引用相同的数据源。所以我试图添加一个GUID到缓存键。 – 2010-10-29 20:06:52

0

虽然这不是最好的解决方案(重新安排逻辑以适应生命周期模型通常是这样),您是否尝试过直接访问请求?有一次,我真的很想得到选择的值过一个DropDownList很早就在生命周期的,所以我可以调整建筑的一些元素,而我却这样说:

myDropDownList.SelectedValue = Page.Request.Form[myDropDownList.UniqueID]; 

因此,而不是等待的视图状态加载服务器端代理的值,我只是从传递过来的客户端控制值中得到它自己的值。如果我重新设计了那个页面,我可能会采取不同的做法,但现在看来它已经行得通,它解决了我遇到的问题。

相关问题