【问题标题】:ASP.NET handling button click event before OnPreInitASP.NET 在 OnPreInit 之前处理按钮单击事件
【发布时间】:2010-03-18 20:26:59
【问题描述】:

我有一个数据访问层、一个业务逻辑层和一个表示层(即页面本身)。

我处理 OnPreInit 事件并填充页面所需的集合。所有数据都来自 SQL Server 数据库,我不使用缓存。

我处理按钮单击事件以从表单中获取值并将新对象插入数据库。问题是当我处理点击事件时,集合已经被填充,所以插入到数据库中的新项目还没有被检索到。

什么是公认的解决方案?

我可以将新对象直接插入到集合中并重新绑定 GridView,但 SQL 查询仅选择一组对象,而新对象可能不在该集合中。

谢谢!

【问题讨论】:

    标签: c# asp.net collections


    【解决方案1】:

    我通常在页面的两个地方进行数据绑定:

    1. 在Page_Load里面,如果!IsPostBack加载初始状态。

    2. 作为事件处理程序中的最后一行,用于显示添加/编辑/删除记录的结果。

    您遇到的问题只是使用 OnPreInit 进行数据绑定的结果,因此您可能不得不停止这样做,或者尝试其他人建议的次优方法之一(重定向回发后返回页面)。

    【讨论】:

    • 科里的解释最全。这里的关键是您不想在 PostBack 上重新绑定数据,除非由于用户操作(即添加新项目)而明确要求这样做。查看 Microsoft 的任何数据绑定示例,例如 GridView。
    • 这很棒,加上 pmarflee 的提示,我已经解决了这个问题。谢谢!
    【解决方案2】:

    在页面生命周期的后期执行数据绑定操作,例如在处理任何控件事件后触发的页面 PreRender 事件中。

    【讨论】:

      【解决方案3】:

      您应该只处理点击事件。然后在您的数据库更新/插入之后,您必须重新绑定您的数据。根据您的实施,您可能需要重新发布页面。如果你要使用普通的数据绑定,你可以再次调用 bind 方法。

      【讨论】:

      • 如果可能的话,我想避免再次往返于数据库和 Web 服务器,在这种情况下似乎没有必要。
      • 如果业务逻辑在数据库中,就得问数据库怎么办。您可以从告诉您要做什么的插入语句中返回一些值,但这似乎很老套。
      【解决方案4】:
      1. 检索 Page.LoadComplete 事件的数据并进行数据绑定。
      2. 如果出于某种原因,应仅在 PreInit 上检索它们,然后在 !IsPostBack 条件下检索它们并绑定它们,对于 PostBack 条件,在 LoadComplete 上处理它们

      【讨论】:

        【解决方案5】:

        可以使用此方法来确定哪个控件在 PreInit 中发出回发:http://blogs.microsoft.co.il/blogs/gilf/archive/2010/03/01/discover-which-control-raised-a-postback.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多