c#
  • asp.net
  • webforms
  • viewstate
  • page-lifecycle
  • 2016-09-16 71 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"); 
    } 
    
    相关问题