【问题标题】:ObjectDataSource firing twice, or on its ownObjectDataSource 触发两次,或单独触发
【发布时间】:2010-04-14 21:24:06
【问题描述】:

有人可以准确解释 ObjectDataSource 是如何/何时触发的吗?我有一个 ASP.NET 页面,它带有一个引用 ODS 的 GridView。我在 ODS 使用的方法中设置了一个断点,发现它触发了两次。

我查看了代码,起初答案似乎很明显。我有

    Page_Load()
    {
      if(!Page.IsPostBack)
      {
          MethodA();
          MethodB();
      }
    }

其中 MethodA 和 MethodB 最终都调用了 gv.DataBind()。这是有道理的,因为我假设每次调用 GridView.DataBind() 都会导致向 ODS 询问数据,因此运行我的数据访问方法。

奇怪的是,当注释掉对 MethodA 的调用时,它仍然会触发两次。检查调用堆栈显示该方法首先作为 MethodB 的结果运行,然后再次运行,除了 [外部代码] 之外没有任何踪迹。当我让 MethodA 和 MethodB 都执行时,这种神秘的负载不会发生

知道这里发生了什么吗?知道我可能有哪些其他代码在向 ODS 询问数据吗?我开始认为所有这些“无代码”数据控件比它们的价值更令人困惑和荒谬。

【问题讨论】:

    标签: asp.net data-binding gridview


    【解决方案1】:

    当我们在代码中动态隐藏/显示 gridview 列时,我遇到了这个问题。

    这是一个讨论可能导致多次选择的问题的页面 http://forums.asp.net/t/1161164.aspx

    【讨论】:

    • 是的,结果就是这样,我们在 GridView.DataBound 事件中隐藏/显示列,如果我们不这样做,它不会触发两次。我会查看您的链接,但是您使用哪种方法解决了这种情况?
    【解决方案2】:

    如果您要更改可见性,即显示和/或隐藏绑定到对象数据源的网格视图的列,则可能会隐式地多次调用网格视图的数据绑定方法。

    在这种情况下,请尝试在 Page_LoadComplete 事件处理程序中封装显示/隐藏 gridview 列代码。

    Page_LoadComplete 事件处理程序在页面生命周期中处于主要位置,以防止多次数据绑定调用,并且在控件更改事件(例如,按钮单击、下拉选定索引更改等)之后调用它仍然有效gridview 数据绑定事件。

    【讨论】:

      【解决方案3】:

      “当注释掉对 MethodA 的调用时,它仍然会触发两次”。所以它可能会被 Page_Load 调用两次。可能你有 AutoEventWireup="true" 并且还在代码http://www.aspdeveloper.net/tiki-index.php?page=ASPFaqEventsDoubleFire中注册事件@

      【讨论】:

      • 不,看起来 Page_Load 只被调用了一次。谢谢你的链接,我去看看。
      【解决方案4】:

      如果你用类似的东西设置gridview的数据源

      gv.DataSourceID=dsObjDataSource;
      

      然后网格视图会自行调用gv.DataBind()

      【讨论】:

      • 两个文件中的哪个设置了该属性(aspx 和 aspx.cs)没有区别
      【解决方案5】:

      我遇到了同样的问题 - 问题是我在数据绑定之后或期间隐藏/显示了一列。 数据绑定之前移动隐藏/显示代码会阻止绑定发生两次,我怀疑这与将其移动到 Page_Load 的效果相同。在我的情况下,数据绑定是为了响应下拉列表框的变化而发生的——在 DataBind() 调用为我修复了 twofer 问题之前执行列添加/删除。

      【讨论】:

      • 在我们的场景中,我们还发现我们在标记中指定了一些列,ods 将获取这些列并第一次绑定,然后我们使用 ITemplate 类动态注入列,那是触发重新绑定。我讨厌 ODS。
      【解决方案6】:

      使用asp:DataListasp:ObjectDataSource 发生两次DataBinding,我得到了相同的结果。

      原来是因为我在选择参数中使用了UserControl:

      <asp:ControlParameter Name="GroupID" Type="Int32" DefaultValue="-1"
          ControlID="UserControl1" PropertyName="SelectedGroupID" />
      

      我对 UserControls 感到厌倦了。我可以看到它们可能如何提高 5 年级学生的生产力,但它们完全是在浪费时间。

      【讨论】:

      • 事实上,我已经厌倦了 ASP.NET 网络表单。换了工作,现在我在做 MVC。它并不完美,但我不会错过网络表单控件的黑盒疯狂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多