我有一个用户控件,它有一个像这样的公共属性:
public string[] ImageIDArray {
get;
set;
}
在我的控制范围内,我有一个转发器,在转发器里面我有一个标准的asp.net按钮。单击该按钮时,我需要操作ImageIDArray属性。我正在使用ItemCommand事件处理程序。
问题是当ItemCommand处理程序运行时ImageIDArray为null。所以,这里有2个问题。
1)在页面生命周期的什么时候设置属性(除非以编程方式设置它们) 2)我如何解决这个问题。我是否需要将值存储在viewstate中?
提前致谢 人
答案 0 :(得分:1)
请看一下这篇文章。 Repeater.ItemCommand Event
我认为它包含您所需的相关信息。
答案 1 :(得分:1)
整个页面生命周期实际上是无状态的,除了给出状态感知的视图状态。每次执行回发时都会重新创建页面上的控件。 This MSDN文章很好地解释了它。先前加载到渲染控件的数据保存在viewstate中(对于vs启用的控件)并加载回它们,除非用户在回发之前更改了它们。如果用户更改了它们并且您进行了回发,那么这些值将加载到LoadPostBackData
事件中,该事件在填充视图状态后运行。
我不知道你在何时何地将数据加载到ImageIDArray中,但我假设你没有在每次回发时加载它,这就是你的itemCommand事件处理程序中数据为空的原因。
要回答您的第一个问题,只是拥有一个属性并没有做任何事情,重要的是您要为其设置值。如果要为ascx文件中的属性赋值,它将保留在控件中。否则,您必须每次都加载它。
在用户控件的ImageIdArray
事件上加载Page_Load
。 page_Load事件在触发ItemCommand
事件之前运行。如果您不想在每次回发时加载ImageArray
,可以考虑将其存储在session
或viewstate
中。存储在会话中意味着数据可供您用户的会话持续时间。 ViewState
只有在您访问该页面时才会持续。
您可以手动将数据添加到ViewState
ViewState["ImageIdArray"] = ImageIdArray.
或者您可以将您的媒体资源更改为
public string[] ImageIdArray
{
get { return (string[])(ViewState["ImageIdArray"] ?? null); }
set { ViewState["ImageIdArray"] = value; }
}
Here是一篇文章,详细解释了asp.net中的状态管理。