Web用户控件持久化属性(viewstate,session,context)我错过了什么

时间:2012-02-13 07:57:39

标签: asp.net user-controls viewstate

也许有人可以帮助我。我创建了一个简单的Web用户控件,一个日期和时间选择器,可以放到我的webform上。这一切都很好,我可以设置属性,为ui等使用控制令人满意。

当需要“使用”控件的selected_date_time属性时,我无法让它继续存在。没什么..我已经研究过并且无休止地尝试使用视图,上下文和会话。 Onbiouosly会话工作,但它很脏,我使用这个控件的两个副本(开始和结束时间),所以会话变量真的需要被黑客攻击他的工作。

我错过了什么吗?每当发生某些事情时,控件都会被初始化,并且显然会丢失其状态信息。 ui保持其状态,因为我可以选择日期,将该日期写入标签,并且持续存在。但是当我尝试访问我的控件属性以检索所选的组合日期和时间时(已经在视觉上保持不变),它什么都没有。我调试了,每当我在页面上做任何形式的帖子时它都会被初始化。

有人可以帮我解释一下吗?它现在真的开始成为一个问题。

提前致谢。

示例:(简单组件)

UC _ save_method

ViewState("var_time") = "My veiwstate text"

表格_read_method

dim str as string = ViewState("var_time")

表单在viewstate var。

中看不到任何内容

我也尝试过普通的属性和值,这是不行的,这就是为什么我继续为我的属性查看var的原因。现在,我只是试图让viewstate工作,即使没有属性。

似乎我的表格和控件必须有两个单独的视图状态?关于观点,我有点像n00b。

由于

[溶液] 您必须在控件的prerender方法上显式重置您的属性。我的误解是页面和控件共享同一个视图状态。结果是控件和它所在的页面,有自己独立的视图状态。

如此荒谬地,在控件中的属性集函数中,在viewstate中设置您的值,并在预渲染时,获取该viewstate值,并设置属性get variable = - viewstate中的值。

您现在可以从您的页面访问该属性,就好像一切正​​常并且世界没有结束...... pheww

感谢cnay指导我。

'Usr control xyz

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender

my_time = ViewState("var_time") 'my_time is the get variable for property date_time

End Sub

'page use

xyz.date_time

1 个答案:

答案 0 :(得分:2)

也许,您应该发布完整的控制代码以获得更好的答案,但一般而言 - 视图状态(或控制状态)是持久控制状态(如属性)的通常正确方法。每个控制实例都获得不同的视图状态包,因此很容易避免碰撞。

现在,遇到问题,典型的可编辑控件首先从视图状态恢复其状态,然后根据需要使用请求数据修改状态。例如,一个简单的文本框控件会将其文本值保持在视图状态。在回发后,文本值将从视图状态恢复,然后被请求中存在的值覆盖(由UniqueID属性查找)。

现在,对于用户控件,通常可以使用子控件值(或属性)来派生控件值/属性 - 因此这些可能不会使用视图状态。但是,如果添加不由子控件备份的属性/状态,则可能必须在视图状态中备份它们。因此,假设您的用户控件有两个子控件 - 一个用于Date,另一个用于时间,然后可以组合它们的值以获得控件的选定日期时间值。