【问题标题】:ASP.Net Page Lifecycle and dynamic controlsASP.Net 页面生命周期和动态控件
【发布时间】:2020-06-26 09:14:14
【问题描述】:

我有点卡在 ASP.Net 的页面生命周期中。这是我从事 React 多年后的第一个 ASP.Net 项目,所以我可能会遗漏一些东西;)

简化代码:

 protected void Page_Load(object sender, EventArgs e)
 {
    BuildView();
 }

 private void BuildView()
 {
    switch (pageViewMode.Value)
    {
        case "Overview": BuildOverview(); break;
        case "Runs": BuildRunsOverview(); break;
    }
 }

 private void BuildOverview()
 {
    var tilesContainer = new TilesContainer();
    tilesContainer.OnTileClicked += (InfoTile targetTile) =>
            {
                pageViewMode.Value = targetTile.Value;
                BuildView();
            };
    rootElement.Controls.Add(tilesContainer);
 }

问题是“OnTileClicked”事件仅在第一次加载时有效,在回发后无效。我相信它与页面生命周期和在控制事件之后注册事件有关(https://docs.microsoft.com/en-us/previous-versions/aspnet/ms178472(v=vs.100)?redirectedfrom=MSDN)。

如果真的是这样,我该如何从后面的代码动态构建页面?我真的应该创建所有控件(BuildOverview() 和 BuildRunsOverview())然后有条件地显示或隐藏它们吗?

【问题讨论】:

  • 如果我没记错的话(已经有一段时间了),你需要检查 IsPostBack() 并且只有在不是回发时才调用 BuildView()
  • 如果我不构建,如果它不是回发,我在页面上看不到任何内容,因为页面本身只有 rootElement div。
  • 也许你想做这样的事情stackoverflow.com/a/8587602/1098100
  • 这是一个Web forms 项目,对吧?在这种情况下,我同意下面@Homungus 的回答。在 Web 表单中使用动态创建的控件是可能的,但要让它正常工作是一件很痛苦的事情。如果您的用例不只是一个微不足道的用例,那么您最终会发现自己重新发明了 Web 表单系统为您开箱即用的页面状态管理,如果您只需在 .aspx 文件中添加控件即可。跨度>

标签: c# asp.net


【解决方案1】:

'我真的应该创建所有控件(BuildOverview() 和 BuildRunsOverview()),然后有条件地显示或隐藏它们吗?'

答案是:是的。
您不会从后面的代码动态构建页面 - 至少它在 asp.net 页面中没有得到很好的支持。
在您的情况下,您需要在每次回发时使用 TilesContainer 并将事件处理程序附加到它,否则将不会调用该事件。因此,将所有控件放入标记 (.aspx) 中并根据您的代码将它们设置为 Visible = false/true 会更容易。您设置为 Visible = false 的控件不会在客户端呈现,因此至少没有开销。
如果您使用自定义控件(我假设您的 TilesContainer 是自定义控件),那么您需要以正确的方式实现 Visible-property,例如如果您的TilesContainers 主控件是Panel,则覆盖Visible 并在那里设置值:

公共覆盖布尔可见
{
    得到{返回基地。可见; }
    // 在这里设置所有必要的控件可见性
    设置 { this.pnlMain.Visible = base.Visible = 值; }
}

【讨论】:

  • 我将控件移到了 html 中,现在可以使用了,谢谢!一个问题。为什么在我的控件中设置 Visible = False 不起作用?我最终得到了 if (!this.Visible) { return; } 在 RenderControl 但不是很喜欢它:]
  • 我更新了答案,为您指明了正确的方向。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多