回发后属性为null - 动态加载控件

问题描述 投票:6回答:3

我知道这个问题之前已被问过多次,但我怀疑我有一个独特的场景。

我正在加载一个Child Control(ASCX)并在该Control上设置一个Property。这个工作完全正常,直到postback属性为null。

这里加载ChildControl的First Class:

protected override void CreateChildControls()
{
    MyUserControl control = (MyUserControl)Page.LoadControl(_ascxPath);
    control.MyProperty = base.MyProperty
    Controls.Add(control);
}

然后,在我的Child Control上,我得到了以下代码:

public partial class MyUserControl : UserControl
{
    public MyType MyProperty { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        //Exception on next line because Property is null (only on postback)
        var somevalue = MyProperty.SubProperty;
asp.net ascx
3个回答
12
投票

好。让我试着解释一下。 1.创建页面后,您将获得整页lifecycle 2.您单击某个控件以创建用户控件,然后您就可以获得它 3.现在您正在为此控件输入值,并获得回发 4.在服务器端处理回发,但正如您所见,只要加载页面,就会看到viewstate操作。 viewstate的主要目的之一是处理控制事件,查看它们是否已更改,或保存其状态或其他内容。 5.如果此时,当加载viewstate时,你仍然没有构造控件,那么它的所有事件和值都将被忽略。

解决方案要么使其成为静态控件而只是隐藏它,要么在viewstate操作开始之前创建它。


5
投票

您需要在Page_Init事件中添加控件和设置属性,否则您将丢失属性值。


2
投票

在Microsoft关于ASP.NET页面life cycle的解释中,编写了必须在PreInit中创建动态创建的控件。

它对我有用。这是我的主页:

protected global::System.Web.UI.HtmlControls.HtmlGenericControl FiltersZone;

(. . .)

 protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        FiltersZone.Controls.Add(new PlanningFiltersSurgeonWeb());
    }

这个动态创建的“.ascx”控件包含一个隐藏字段:

<input id="hidTxtPaint" type="hidden" name="hidTxtPaint" runat="server" />

我现在能够在从JavaScript启动的“Page_Load”或“submit”之后从动态创建的ASCX控件__dopostback('hidTxtPaint')事件中检索其值。

另一方面,如果在主页的Page_Load事件中添加其父“.ascx”控件,则POST后隐藏字段的值始终为空。

© www.soinside.com 2019 - 2024. All rights reserved.