簡體   English   中英

ASP.Net 頁面生命周期和動態控件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM