6

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

我正在加载一个子控件 (ASCX) 并在该控件上设置一个属性。这工作得很好,直到属性为空的回发。

特此加载 ChildControl 的第一类:

protected override void CreateChildControls()
{
    MyUserControl control = (MyUserControl)Page.LoadControl(_ascxPath);
    control.MyProperty = base.MyProperty
    Controls.Add(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;
4

3 回答 3

12

行。让我试着解释一下。
1. 创建页面后,您将获得完整的页面生命周期
2. 您单击某个控件以创建用户控件,然后获得它
3. 现在您正在向该控件输入值,并获得回发
4. 在服务器端回发被处理,但正如您所见,视图状态操作会在页面加载后立即出现。
viewstate 的主要目的之一是处理控制事件,查看它们是否被更改,或者保存它们的状态或其他东西。
5. 如果此时加载视图状态时您的控件仍未构造,则它的所有事件和值都将被忽略。

解决方案要么使其成为静态控件并隐藏它,要么在视图状态操作开始之前创建它。

于 2012-06-07T09:25:43.030 回答
6

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

于 2012-06-07T09:57:09.420 回答
2

在微软关于 ASP.NET 页面生命周期的解释中,写到动态创建的控件必须在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 启动的“ ”或“ ”之后,我现在能够从动态创建的 ASCX 控件Page_Load事件中检索其值。submit__dopostback('hidTxtPaint')

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

于 2016-02-16T09:18:03.050 回答