ASP.NET生命周期二分法:动态添加控件和事件

ASP.NET生命周期二分法:动态添加控件和事件,asp.net,events,controls,page-lifecycle,pageload,Asp.net,Events,Controls,Page Lifecycle,Pageload,情况: 我有一些带有按钮的用户控件,这些按钮钩住了事件。带有事件的控件需要在Page_Load或更早版本中初始化 我希望通过单击Add按钮动态生成这些用户控件 重要的是要记住,只有在页面加载完成之前才会触发事件,如单击事件。 破碎的溶液A: 页面加载:动态创建一个添加按钮,钩子点击事件 用户单击添加按钮,触发回发 页面加载:像往常一样创建添加按钮,并钩住单击事件 页面加载:不知道添加按钮已被单击,因此不知道生成用户控件 AddButton\u单击:页面最终意识到应在下一页加载时添加新的用户控件。

情况:

  • 我有一些带有按钮的用户控件,这些按钮钩住了事件。带有事件的控件需要在Page_Load或更早版本中初始化
  • 我希望通过单击Add按钮动态生成这些用户控件
  • 重要的是要记住,只有在页面加载完成之前才会触发事件,如单击事件。

  • 破碎的溶液A:

  • 页面加载:动态创建一个添加按钮,钩子点击事件
  • 用户单击添加按钮,触发回发
  • 页面加载:像往常一样创建添加按钮,并钩住单击事件
  • 页面加载:不知道添加按钮已被单击,因此不知道生成用户控件
  • AddButton\u单击:页面最终意识到应在下一页加载时添加新的用户控件。
  • 用户无法看到他们添加的控件,因为已触发另一个页面加载
  • 用户通过单击按钮、刷新页面等方式重新加载页面
  • 页面加载:创建添加按钮,并单击事件。现在意识到添加了用户控件,创建了用户控件。钩住用户控件内的事件
  • 用户单击用户控件中的按钮,触发就可以了
  • 结果:用户已单击以添加新的用户控件,服务器知道该控件应该存在,但用户直到再次触发页面加载(通过单击其他按钮或刷新等)后才看到该控件

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

    破碎的溶液B:

  • Page_LoadComplete:动态创建添加按钮、钩子单击事件
  • 用户单击添加按钮,触发回发
  • Page_LoadComplete:像往常一样创建Add按钮,并钩住click事件
  • 添加按钮\u单击:页面意识到应在下一页加载完成时添加新的用户控件。
  • Page\u LoadComplete:意识到按钮点击,动态添加控件,并带有其自身的内部按钮点击事件。
  • 用户单击添加的用户控件中的按钮,但不会触发
  • 结果:除了添加的用户控件中的按钮是惰性的之外,所有操作都非常有效

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


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

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

    您的添加按钮需要使用Javascript或jQuery执行其神奇的客户端。服务器端代码在这里不起作用,除非你打算在他们每次单击“添加”按钮时往返(即发布)页面。目前,让它在每次单击按钮时发布一次并不是世界末日(现在)。问题是,由于它们的生命周期,我的最佳解决方案是让它发布两次。如果这是我能做的最好的,那就是ASP.NET计划中的一个相当大的缺陷,这让我很难过。事实上,Page_PreInit事件应该是添加动态控件的更好的事件。