【问题标题】:ASP.NET Life-cycle Dichotomy: Dynamically Added Controls and EventsASP.NET 生命周期二分法:动态添加的控件和事件
【发布时间】:2010-09-01 22:07:58
【问题描述】:

情况:

  • 我有带有挂钩事件的按钮的用户控件。带有事件的控件需要在 Page_Load 或更早的时候初始化。
  • 我希望通过单击添加按钮动态生成这些用户控件。
  • 请务必记住,点击事件等事件直到 Page_LoadComplete 之前才会触发。

  • 破碎的解决方案 A:

    1. Page_Load:动态创建Add按钮,hook点击事件。
    2. 用户点击添加按钮,触发回发。
    3. Page_Load:像往常一样创建添加按钮,并挂钩点击事件。
    4. Page_Load:不知道 Add 按钮已被点击,因此它不知道生成用户控件!
    5. AddButton_Click:页面终于意识到应该在下一个 Page_Load 时添加一个新的用户控件。
    6. 用户看不到他们添加的控件,因为另一个 Page_Load 已被触发。
    7. 用户通过单击按钮、刷新页面等方式重新加载页面。
    8. Page_Load:创建添加按钮,并挂钩单击事件。现在知道添加的用户控件,创建用户控件。在用户控件中挂钩事件。
    9. 用户点击用户控件内的按钮,触发就好了。

    结果:用户点击添加一个新的用户控件,服务器知道该控件应该存在,但用户在触发页面再次加载之前看不到它(通过单击另一个按钮,或刷新等)。

    当然,我查看了生命周期,发现 Page_LoadComplete 发生在事件之后,所以如果我在 Page_LoadComplete 中放置任何与事件相关的代码,应该一切都好吗?

    破碎的解决方案 B:

    1. Page_LoadComplete:动态创建Add按钮,hook点击事件。
    2. 用户点击添加按钮,触发回发。
    3. Page_LoadComplete:像往常一样创建添加按钮,并挂钩点击事件。
    4. AddButton_Click:页面意识到应该在下一个 Page_LoadComplete 时添加新的用户控件。
    5. Page_LoadComplete:感知按钮点击,动态添加控件,自带内部按钮点击事件。
    6. 用户点击了添加的用户控件中的按钮,但没有触发!!

    结果:一切都很好,除了添加的用户控件中的按钮是惰性的。

    难题是:我需要通过单击按钮生成控件,这意味着我需要将 Controls.Add(...) 代码放入 Page_LoadComplete 中。相反,我需要添加的控件具有工作事件,这意味着 Controls.Add(...) 代码需要在 Page_Load 中。我有一个完美的二分法。

    我能想到的唯一 janky 解决方案是采用解决方案 A 并在单击“添加”按钮后强制页面手动重新加载,这是对带宽和处理的浪费。

    【问题讨论】:

    • 您的“添加”按钮需要使用 Javascript 或 jQuery 完成其神奇的客户端。服务器端代码在这里不起作用,除非您打算在每次点击“添加”按钮时往返(即发布)页面。
    • 目前,每次点击按钮都发布一次,这还不是世界末日。问题是,由于它们的生命周期,我最好的解决方案是让它 POST 两次。如果这是我能做的最好的,那是 ASP.NET 规划中的一个相当大的缺陷,这让我很难过。

    标签: asp.net events controls page-lifecycle pageload


    【解决方案1】:

    这可能不是最佳做法,但您可以检查 Request.Form 以获取在 Page_Init 事件期间单击添加按钮的证据,并在那里添加控件。它应该可以解决您的问题。

    【讨论】:

    • 其实Page_PreInit事件应该是添加动态控件比较好的事件。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2011-01-21
    • 2010-10-15
    相关资源
    最近更新 更多