【问题标题】:How to update page data after event handling?事件处理后如何更新页面数据?
【发布时间】:2010-10-21 07:24:56
【问题描述】:
在 Page_Init 上,我根据几个数据库表创建了一个动态创建的控件表。其中一个控件是用于将列表项向上移动的 ImageButton。此事件处理程序的作用是更新数据库中的 SortOrder 列以查找受影响的项目。
现在的问题是,因为控件是在 Page_Init 事件中创建的,并且 SortOrder 稍后会在 ImageButton 命令事件被触发时更新。使用正确的 SortOrder 更新表的最佳过程是什么。如果我在事件触发后重新创建表,ImageButton 命令事件将不再起作用。
- 我应该实现一种方法来更新表中的数据而不重新创建它吗?
- 是否应该在事件触发后以代码重新加载页面?
解决此问题的首选方法是什么?
【问题讨论】:
标签:
asp.net
event-handling
page-lifecycle
【解决方案1】:
首先,您似乎将数据手动绑定到 UI 控件。在 Asp.Net 中,有许多方法可以使用内置的数据绑定技术来避免这种情况。许多控件(如 GridView)允许从给定数据源自动创建 Html 表。还有许多其他选项,包括中继器。
无论您选择如何绑定数据,技术都是在页面生命周期中的某个时间点重新绑定。
你需要...
- 使用默认排序顺序在第一页加载时绑定您的数据
- 在更改排序顺序后重新绑定图像按钮的事件处理程序中的数据。
代码看起来像这样......
private void Page_Load (...)
{
if (!IsPostBack)
//On First Load
BindData(defaultSoortOrder);
else
BindData(currentSortOrder);
}
private void ImageButton_Click (...)
{
currentSortOrder = newSortOrder;
BindData(currentSortOrder);
}
如果单击 Image 按钮,您最终将调用 BindData 两次。但这是必要的,因为可以从任何控件启动页面回发,因此您需要始终确保在页面加载时绑定数据。
【解决方案2】:
诸如Init 和Load 之类的页面事件将始终在引发回发的事件处理程序之前触发。这是Page lifecycle 的基础(对于Peter Bromberg 的视觉表示,see here)。大多数刚接触 ASP.NET 的开发人员在理解和妥善处理这一“困境”方面存在重大问题。
理想的方法是:
一个。您的Page_Init 应该调用一个过程(我们称之为BindData() 以进行说明)来处理基于数据库数据的表的创建。此方法类似于绑定到数据库数据并基于该绑定呈现 UI 元素的绑定方法。 IOW,你应该把Page_Init方法中的建表代码去掉,放到一个单独的方法中,以便在需要的时候调用。
重要提示:此BindData() 方法还处理将动态创建的ImageButton 控件的事件处理程序附加到控件。我们称之为ImageButton_Click。这对于控制在后续回发时触发的事件至关重要。
b.当您的 ImageButton_Click 方法执行时,它会调用 BindData() 方法来重新创建表及其绑定,但使用新的排序规则。
所以,第一次加载的执行顺序是:
Page_Init
BindData()
后续加载(回发)的执行顺序是:
Page_Init
-
BindData() - 附加了 ImageButton 的事件处理程序。
ImageButton_Click
BindData()
【解决方案3】:
你需要这样的东西......
- OnInit (IsPostBack = 假)
- 动态创建 ImageButton
- Wireup ImageButton 事件处理程序
- 加载表 - 检查会话/变量中的排序顺序。如果没有;使用默认值
点击按钮
导致其他一些回发
- OnInit (IsPostBack = true / 2nd & Subsequent Postbacks)
- 动态创建 ImageButton
- Wireup ImageButton 事件处理程序
- 加载表 - 检查会话/变量中的排序顺序。如果找到,请使用它。