你可以在加载后强制页面渲染

时间:2012-03-07 15:31:46

标签: c# asp.net user-controls

问题:    我正在基于父页面上的RadTabstrip Control中的选定选项卡加载多个用户控件之一。我已捕获Selected选项卡并将其分配给OnTabClick事件中的Session变量,以在每个用户控件中使用,以确定是否需要呈现该特定控件。

原因是因为每个用户控件都会查询数据库以呈现不同的图表,并且我不希望在每个帖子上发生不必要的处理回到服务器。我想补充说,每个用户控件在其标记中都有几个标签,它们只根据从数据库中检索到的内容获取在运行时分配的文本值。

当我加载主页面时,每个用户控件都会检查所选的选项卡变量,并且该范围内的一切正常。 (索引0处的第一个选项卡没有图表)

问题是当我选择一个具有用户控件的选项卡时,从数据库获取数据并构建图表的相应代码工作正常,但标记中的Label控件的TEXT值不会显示在Page,虽然TEXT值是在Code-Behind中设置的,同时数据正在被检索。

如果我执行同一页面的Post Post,则会出现Label控件的TEXT值。

我认为这是因为页面生命周期的第一阶段包括渲染标记不是在用户控件的初始加载时触发,而是在后续重载或页面刷新时触发。

有办法解决这个问题吗?在点击数据库之后,我正在计算一个对Render事件的调用,但我可能会根据我的想法做出决定。

任何人都可以提供一些建议或可能的解决方案吗?

由于

2 个答案:

答案 0 :(得分:1)

我无法解决后期绑定问题,这会阻止标签文本出现,直到我手动刷新页面,所以我从一个不同的角度处理问题。如果用户选择了相应的选项卡,我仍然保留了仅允许每个用户控件的数据填充的逻辑,但是我将嵌入在我的标记中的内联代码移动到我的代码隐藏文件。

我并不是100%肯定标记与代码隐藏处理的顺序,因此我研究并发现在aspx页面中以声明方式完成的任何操作都会先处理,并且之前创建对象正在后面的代码中访问或更新。 因此,通过这些信息,我将两者完全分开,并且能够在标签上显示文本而没有任何问题。

我仍然希望知道在初始Page_Load之后强制页面调用Render事件以模拟或模仿手动回发的适当方法,但是使用Page Cycle的流程更容易且可能更容易更好的做事方式。

答案 1 :(得分:0)

解决问题的一种方法是考虑使用“更新面板”。它将允许您呈现整个页面,然后在事件上仅刷新更新面板的区域。

一般来说,我会因为性能原因而喜欢这个功能,但有一个问题。某些浏览器(例如Safari和Opera的版本)无法正确呈现这些内容。您的应用程序是否是供消费者普遍使用的Web应用程序?如果是这样,您可能需要在同一页面上考虑整页刷新并传递用户数据(除非Opera /其他浏览器修复了这个缺点 - 我在4个月内没有测试过。)