我知道这个问题之前已被多次询问过,但我怀疑我有一个独特的场景。
我正在加载一个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;
答案 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
事件中。