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

时间:2012-06-07 08:45:36

标签: asp.net ascx

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

我正在加载一个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;

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分: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" control包含一个隐藏字段:

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

我现在能够在&#34; Page_Load&#34;之后从动态创建的ASCX控件submit事件中检索其值。或者&#34; __dopostback('hidTxtPaint')&#34;从JavaScript发起。

另一方面,如果隐藏字段的父级&#34; .ascx&#34;则隐藏字段的值在POST后始终为空。控件已添加到主页的Page_Load事件中。