在用户控件之间共享数据

时间:2010-03-26 21:16:08

标签: asp.net user-controls

在我的页面上,我有n-userControls(相同的控件)我需要在它们之间进行通信(更具体地说,我需要在值中传递一个)。

我不想让托管页面参与其中。

控件充当“寻呼机”,并通过主机页面订阅的事件与主机页面上的分页数据进行交互。
因此,当用户单击其中一个寻呼机并更改其状态时,另一个控件应该知道它并相应地更改自身。

我不能使用VieState,因为viewstate是每个控件,控制状态也是如此。

我可以使用Session吗? (会话是共享的,我只需要存储一个值)

或许我可以使用更好的东西? (没有QueryString)

3 个答案:

答案 0 :(得分:2)

就个人而言,如果不通过控制页面或事件进行此操作,就没有“简单”的方法。

从你所说的我想象的是这样的东西。假设有两个控件A和B是你的寻呼机控件。

包含页面在两个控件上都订阅了“PageSelectionChanged”事件,以响应该事件更新您已有的数据,并通过所有寻呼机控件枚举设置“当前页面”值。

您已经安装了事件管道,用于通过控制进行通信 - >页面,使用您已经构建的内容。

为什么不是会话?

我在评论中被问到这是否会比会话更好,答案是肯定的,原因有很多。

  1. 会话信息,除非明确清理用户会话期间(通常为20分钟)
  2. 如果遇到数字1,则需要向页面添加项目,if(!ispostback)要“清除”会话变量,以便用户不会在不同的页面上启动。
  3. 未来的应用程序增长,会话信息必须从进程移出到SQL Server或以其他方式在Web场环境中工作,为此我也尽量避免使用它。
  4. 使用会话将此信息存储在Web服务器的内存中,尽管很小(如果是整数,则为4个字节),它可以累加并且不是必需的
  5. 根据更新的性质,您无法仅通过会话确保控制顺序,以确保1控制强制更新所有控件。
  6. 还有其他解决方案,类似于上面发布的解决方案,它会对页面进行递归查看,但你必须小心这一点,以确保你不会进入循环/无限递归的情况,此外如果你在页面上有很多控件,它可能会增加很多开销来不断循环遍历所有内容。

答案 1 :(得分:0)

容器页面在viewstate中有一个存储状态的属性。当用户单击其中一个寻呼机时,它会引发由容器页面处理的事件。然后循环遍历n个用户控件并在这些控件上调用公共方法。

答案 2 :(得分:0)

您可以构建观察者模式的快速修改版本。我建议在页面上构建一个管理器控件。但如果您不想修改页面,这是一个快速解决方案。

您可以创建一个静态方法,该方法将通知所有相同类型的控件。通过调用他们的更新方法。随意传递您需要的数据。

protected void control_event(object sender, EventArgs e)
{
    UpdateAllControls(page);
}


public static void UpdateAllControls(Control parent /* can be Page */)
        {
            foreach (Control c in parent.Controls)
            {
                if (c.GetType() == this.GetType())
                    ((MyType)).Update()
                if (c.HasControls())
                    controls = GetAllControls(controls, t, c);
            }
        }