[英]Issues with Custom Server Controls and Events in the ASP.NET page lifecycle
[英]ASP.Net Page Lifecycle and dynamic controls
我有點卡在 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())然后有條件地顯示或隱藏它們嗎?
“我真的應該創建所有控件(BuildOverview() 和 BuildRunsOverview()),然后有條件地顯示或隱藏它們嗎?”
答案是:是的。
您不會從后面的代碼動態構建頁面 - 至少它在 asp.net 頁面中沒有得到很好的支持。
在您的情況下,您需要在每次回發時使用TilesContainer
並將事件處理程序附加到它,否則不會調用該事件。 因此,將所有控件放入標記 (.aspx) 中並根據您的代碼將它們設置為Visible = false/true
會更容易。 您設置為Visible = false
的控件不會在客戶端呈現,因此至少沒有開銷。
如果您使用自定義控件(我假設您的TilesContainer
是自定義控件),那么您需要以正確的方式實現 Visible 屬性,例如,如果您的TilesContainer
的主控件是Panel
,覆蓋Visible
並在那里設置值:
public override bool Visible { get { return base.Visible; } // set all neccessary controls visibility here set { this.pnlMain.Visible = base.Visible = value; } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.