在另一个用户控件的选择基础上,重新创建用户控件中的动态控件

3
大约5个月前,我被分配任务为我的雇主创建一个新的内部网站,因为旧网站难以使用。该网站使用多种.NET语言(经典asp、VB和C#)和多个.NET框架(1.0、2.0、3.5,少数地方使用4.0)。应该只需要一个小时来实现和测试的简单更改需要几天的时间才能实现。
新的内部网站内容通过用户控件进行控制,这些控件在加载时根据您所在的页面和访问级别动态加载。每个用户控件都有一个特定的任务,不会影响页面上的任何其他用户控件。
大约3周前,我的数据库专家(他在上一份工作中是应用程序开发人员)向中层管理层提出了这个想法,即用户控件可以相互通信并影响每个用户控件中可用的选择(所有这些都没有我的知识)。
起初,当我听到这个想法时,我认为这是不可能的。然后,我读到的关于用户控件如何相互通信的所有内容都表明,用户控件必须知道彼此的存在,而这是不可能的,因为所有用户控件都是根据您的访问级别在运行时加载的。上周我找到了一个解决方案,可以使一个用户控件触发自定义事件处理程序,并使我的其他用户控件监听该特定的自定义事件处理程序。
现在,今天,有人问我是否可以为网站上列出所有客户的联系管理部分添加过滤器,类似于Ebay在左侧具有的过滤器,允许您进一步钻取返回的结果。例如,您搜索“平板电视”。Ebay将列出所有符合您搜索的结果,并且在左侧,您可以选择大小范围或品牌以缩小结果。
在我设置的页面上,我加载了3个用户控件来处理标准和结果。Control1具有所有基本的搜索标准(例如行业、地区状态等),Control2具有从Control1中缩小结果的过滤器。Control3根据Control1中的标准显示客户端(因此,Control1触发Control2和Control3都会显示基于Control1的结果)。现在,我从Control2选择标准并触发Control3可以听到并显示结果的事件。
所有这些都起作用,我遇到的问题是,在control2中的控件是动态构建的,当control1中的事件触发时,然后control2进行回传以使control3能够接收到事件,我失去了所有动态控件在control2中,因为这些控件无法在Page_Init中重新创建,因为从control1传递的值不再存在,因为control2进行了回传,并且来自control1的事件只有在control1回传时才会触发。存储从control1传递给control2的值的最佳方法是什么,或者如何让control1control2回传时重新传递这些值,以便我可以重新创建control2中的动态控件?
注意:我尝试使用会话,但在第一次搜索后重新分配来自control1的值时遇到了麻烦。我认为它们无法正常工作的原因是由于我设置control1的方式以及在control2中创建动态控件跳过获取会话值的方式。
提前感谢大家的(希望)有益回复。
更新 事实证明,我在默认页面上运行时加载用户控件的方式是导致“control2”中的动态控件在“control2”回传时未被重新创建的原因。我的默认页面在“page_load”中加载用户控件,而不是在“page_init”中加载(可能忘记将加载用户控件移到“page_init”中,就像我所有其他页面一样)。进行了更改,动态控件在回传时重新创建。
我从“page_load”移动代码到“page_init”后唯一遇到的问题是,“checkbox”控件在回传时将取消选中,即使我选中它们也是如此。我能够通过几个会话变量克服这个问题。
1个回答

0

这是一个常见的问题。

只有在page_init事件中动态创建的控件才能在postback后保留。

page_init期间,动态创建的控件成为DOM的一部分,因此具有sessionstates。如果您可以重构代码以在page_init期间触发动态控件创建,则您的控件应该会保留。

更新:

我从您的评论和帖子中意识到您不愿使用Sessions。问题是Sessions是保存控件的唯一方法。

  • 我处理这种情况的一种方式是创建一个带有控件列表的类对象。当我回到页面时,如果对象存在,我将其用作默认值。
  • 我处理这种情况的第二种方式是将搜索条件保存在Session中,并将条件提供给我的动态控件创建方法。

我知道我需要在page_init期间重新创建控件。我的问题是,基于control1传递给control2的值来重新创建完全相同的控件所需的值在control2 postback时丢失了。我正在寻找存储从control1传递到control2的值的最佳方法,以便在control2 postback时可以重新创建control2中的控件。 - user2045365
我明白了。我也经历过这个问题。你说你不能使用Session,我可以。我创建了一个复杂的类,其中包含List,并将该列表存储起来。在返回时,我检查它是否非空,如果已填充,则使用它重新创建我的报告。虽然不够华丽,但很有效。 - Dave Alperovich
请阅读我的更新帖子。显然这不是你想听到的,但这是我通过大量搜索得到的唯一方法。 - Dave Alperovich
我并没有说我不能使用会话,我是说它们没有按照我尝试使用的方式工作。我将尝试将控件列表存储在会话中,看看是否有效。 - user2045365

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接