我知道这个问题之前已被问过多次,但我怀疑我有一个独特的场景。
我正在加载一个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;
好。让我试着解释一下。 1.创建页面后,您将获得整页lifecycle 2.您单击某个控件以创建用户控件,然后您就可以获得它 3.现在您正在为此控件输入值,并获得回发 4.在服务器端处理回发,但正如您所见,只要加载页面,就会看到viewstate操作。 viewstate的主要目的之一是处理控制事件,查看它们是否已更改,或保存其状态或其他内容。 5.如果此时,当加载viewstate时,你仍然没有构造控件,那么它的所有事件和值都将被忽略。
解决方案要么使其成为静态控件而只是隐藏它,要么在viewstate操作开始之前创建它。
您需要在Page_Init事件中添加控件和设置属性,否则您将丢失属性值。
在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后隐藏字段的值始终为空。