c#
  • asp.net
  • webforms
  • viewstate
  • page-lifecycle
  • 2016-09-16 51 views 0 likes 
    0

    在我的ASP.NET應用程序中 - 啓用了ViewState - 我可以通過簡單地設置它們來重置輸入。這裏是工作的基本簡單的示例:ViewState覆蓋在PostBack上動態添加UserControl(在Placeholder中)的更改

    _TEST.aspx

    <asp:ScriptManager runat="server" />   
    <asp:DropDownList ID="ddl" runat="server" DataSource='<%# new string[] { "A", "B", "C" } %>' /> 
    <asp:Button ID="b" runat="server" UseSubmitBehavior="false" OnClick="b_Click" Text="Test 1" /> 
    

    _TEST.aspx.cs

    protected void Page_Load(object sender, EventArgs e) 
    { 
        this.DataBind(); 
        this.ddl.SelectedValue = "B"; 
    } 
    
    protected void b_Click(object sender, EventArgs e) 
    { 
        Console.WriteLine("Updated"); 
    } 
    

    在這個例子中ddl將與 「A」 的約束,Page_Load上的「B」和「C」,它將始終選擇「B」。所以當你改變選擇並提交時,它將被重置。想象一下,這用於重置特定條件下的某些控件。


    在我來說,我需要這種行爲對動態加載UserControl被添加到一個Placeholder。因爲Placeholder不會保留我需要在每個回發中重新創建控件的內容。 ViewState似乎沒關係。下面是一個示例:

    _TEST.aspx

    <asp:ScriptManager runat="server" /> 
    <asp:PlaceHolder ID="ph" runat="server" /> 
    

    _TEST.aspx.cs

    protected void Page_Load(object sender, EventArgs e) 
    { 
        _TESTUC uc = (_TESTUC)this.Page.LoadControl("~/Controls/_TESTUC.ascx"); 
        this.ph.Controls.Add(uc); 
    } 
    

    _TESTUC.ascx

    <asp:DropDownList ID="ddl" runat="server" DataSource='<%# new string[] { "A", "B", "C" } %>' /> 
    <asp:Button ID="b" runat="server" UseSubmitBehavior="false" OnClick="b_Click" Text="Test 2" /> 
    

    _TESTUC.ascx.cs

    protected void Page_Load(object sender, EventArgs e) 
    { 
        this.DataBind(); 
        this.ddl.SelectedValue = "B"; 
    } 
    
    protected void b_Click(object sender, EventArgs e) 
    { 
        Console.WriteLine("Updated"); 
    } 
    

    同樣,在每一個回發我想重置DropDownList用於測試目的的選擇,但有趣的是它會記住我的選擇。

    我能做些什麼來解決這個問題?

    回答

    0

    在寫這個問題時,我找到了解決方案,但決定將它發佈給其他人,反正。

    看來ASP.NET將加載並在ASPX中定義的控制ViewState之間Page_InitPage_Load,而它加載在了在加載代碼隱藏控件Page_LoadPage_LoadComplete之間的ViewState

    設置在Page_LoadComplete值解決了這個問題:

    protected void Page_Init(object sender, EventArgs e) 
    { 
        this.Page.LoadComplete += new EventHandler(this.Page_LoadComplete); 
    } 
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        this.DataBind(); 
    } 
    
    protected void Page_LoadComplete(object sender, EventArgs e) 
    { 
        this.ddl.SelectedValue = "B"; 
    } 
    
    protected void b_Click(object sender, EventArgs e) 
    { 
        Console.WriteLine("Updated"); 
    } 
    
    相關問題