在用户控件之间共享数据

tor*_*aan 6 asp.net user-controls

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

我不想涉及托管页面.

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

我不能使用VieState,因为viewstate是每个控件,因此是controlstate.

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

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

Mit*_*ers 2

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

根据你所说的,我想象的会是这样的。假设两个控件 A 和 B 是您的寻呼机控件。

包含页面订阅两个控件上的“PageSelectionChanged”事件,响应该事件,它更新您已有的数据,并且它通过设置“当前页面”值的所有分页器控件进行枚举。

您已经准备好了用于从控制 -> 页面进行通信的事件管道,请使用您已经构建的内容。

为什么不是会话?

有人在评论中问我这是否比会话更好,出于多种原因,答案是肯定的。

  1. 会话信息,除非明确清理,在用户会话期间(通常为 20 分钟)都存在
  2. 对于第 1 种情况,您需要向页面添加项目,以便 if(!ispostback) 来“清除”会话变量,以便用户不会在不同的页面上启动。
  3. 未来应用程序的增长,会话信息必须从进程中移出到 SQL Server 或以其他方式在网络场环境中工作,为此我也尽量避免这样做。
  4. 使用会话将此信息存储在网络服务器的内存中,尽管很小(如果是整数,则为 4 字节),但它可以累加并且没有必要
  5. 根据更新的性质,您无法仅通过会话来确保控制顺序以确保 1 个控件强制更新所有控件。

还有其他解决方案,该解决方案类似于上面发布的解决方案,它会递归地查看页面,但您必须小心,以确保不会陷入循环/无限递归的情况,此外,如果您页面上有很多控件,不断循环所有内容会增加大量开销。