【问题标题】: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 表。还有许多其他选项,包括中继器。

    无论您选择如何绑定数据,技术都是在页面生命周期中的某个时间点重新绑定。

    你需要...

    1. 使用默认排序顺序在第一页加载时绑定您的数据
    2. 在更改排序顺序后重新绑定图像按钮的事件处理程序中的数据。

    代码看起来像这样......

    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】:

      诸如InitLoad 之类的页面事件将始终在引发回发的事件处理程序之前触发。这是Page lifecycle 的基础(对于Peter Bromberg 的视觉表示,see here)。大多数刚接触 ASP.NET 的开发人员在理解和妥善处理这一“困境”方面存在重大问题。

      理想的方法是:

      一个。您的Page_Init 应该调用一个过程(我们称之为BindData() 以进行说明)来处理基于数据库数据的表的创建。此方法类似于绑定到数据库数据并基于该绑定呈现 UI 元素的绑定方法。 IOW,你应该把Page_Init方法中的建表代码去掉,放到一个单独的方法中,以便在需要的时候调用。

      重要提示:BindData() 方法还处理将动态创建的ImageButton 控件的事件处理程序附加到控件。我们称之为ImageButton_Click。这对于控制在后续回发时触发的事件至关重要。

      b.当您的 ImageButton_Click 方法执行时,它会调用 BindData() 方法来重新创建表及其绑定,但使用新的排序规则。

      所以,第一次加载的执行顺序是:

      1. Page_Init
      2. BindData()

      后续加载(回发)的执行顺序是:

      1. Page_Init
      2. BindData() - 附加了 ImageButton 的事件处理程序。
      3. ImageButton_Click
      4. BindData()

      【讨论】:

        【解决方案3】:

        你需要这样的东西......

        • OnInit (IsPostBack = 假)
          • 动态创建 ImageButton
          • Wireup ImageButton 事件处理程序
          • 加载表 - 检查会话/变量中的排序顺序。如果没有;使用默认值

        点击按钮

        • OnInit (IsPostBack = true / 1st Postback)

          • 动态重新创建 ImageButton
          • Wireup ImageButton 事件处理程序
          • 加载表 - 使用默认排序顺序
        • ImageButton_OnClick(还是第一次回发)

          • 重新加载表格 - 使用特定的排序顺序
          • 将此排序顺序变量保存在 Viewstate/Session 变量中

        导致其他一些回发

        • OnInit (IsPostBack = true / 2nd & Subsequent Postbacks)
          • 动态创建 ImageButton
          • Wireup ImageButton 事件处理程序
          • 加载表 - 检查会话/变量中的排序顺序。如果找到,请使用它。

        【讨论】:

        • 他们怎么说“伟大的思想” ;-)
        猜你喜欢
        • 2021-06-08
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多