使用Repeater_ItemCommand访问公共属性

时间:2011-08-18 23:57:59

标签: c# asp.net user-controls

我有一个用户控件,它有一个像这样的公共属性:

public string[] ImageIDArray {
    get;
    set;
}

在我的控制范围内,我有一个转发器,在转发器里面我有一个标准的asp.net按钮。单击该按钮时,我需要操作ImageIDArray属性。我正在使用ItemCommand事件处理程序。

问题是当ItemCommand处理程序运行时ImageIDArray为null。所以,这里有2个问题。

1)在页面生命周期的什么时候设置属性(除非以编程方式设置它们) 2)我如何解决这个问题。我是否需要将值存储在viewstate中?

提前致谢 人

2 个答案:

答案 0 :(得分:1)

请看一下这篇文章。 Repeater.ItemCommand Event

我认为它包含您所需的相关信息。

答案 1 :(得分:1)

整个页面生命周期实际上是无状态的,除了给出状态感知的视图状态。每次执行回发时都会重新创建页面上的控件。 This MSDN文章很好地解释了它。先前加载到渲染控件的数据保存在viewstate中(对于vs启用的控件)并加载回它们,除非用户在回发之前更改了它们。如果用户更改了它们并且您进行了回发,那么这些值将加载到LoadPostBackData事件中,该事件在填充视图状态后运行。 我不知道你在何时何地将数据加载到ImageIDArray中,但我假设你没有在每次回发时加载它,这就是你的itemCommand事件处理程序中数据为空的原因。

要回答您的第一个问题,只是拥有一个属性并没有做任何事情,重要的是您要为其设置值。如果要为ascx文件中的属性赋值,它将保留在控件中。否则,您必须每次都加载它。

在用户控件的ImageIdArray事件上加载Page_Load。 page_Load事件在触发ItemCommand事件之前运行。如果您不想在每次回发时加载ImageArray,可以考虑将其存储在sessionviewstate中。存储在会话中意味着数据可供您用户的会话持续时间。 ViewState只有在您访问该页面时才会持续。

您可以手动将数据添加到ViewState ViewState["ImageIdArray"] = ImageIdArray.或者您可以将您的媒体资源更改为

public string[] ImageIdArray

{

    get { return (string[])(ViewState["ImageIdArray"] ?? null); }

    set { ViewState["ImageIdArray"] = value; }

}

Here是一篇文章,详细解释了asp.net中的状态管理。