【发布时间】: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文件中添加控件即可。跨度>