更新:我一直在对我的控制进行一些实验,我想我已经接近了。请阅读更新信息。为什么我的自定义用户控件的子项未被初始化?
我有2个ASP.NET 2.0用户控件,其中一个放置在里面另一个是。在内部控件的内部,我有一个HtmlAnchor
标签控件,我试图从外部控件中设置一个URL。当我尝试从呈现页面的标记中设置HRef
属性时,HtmlAnchor
控件是null
并引发异常。
的URL set
属性被称为之前任一内部或外部的控制和主页的“OnPreInit
”事件之前的事件的OnInit。我假设这是因为我在页面上的父控件的标记中设置了子控件的URL,因此我在呈现控件时意味着该值在OnInit()
之前设置。下面是我使用的代码(精简)版本:
[ParseChildren(true)]// <- Setting this to false makes the
// page render without an exception
// but ignores anything in the markup.
[PersistChildren(false)]
public partial class OuterControl : System.Web.UI.UserControl
{
// The private '_Inner' control is declared
// in the .ascx markup of the control
[PersistenceMode(PersistenceMode.InnerProperty)]
public InnerControl Inner
{
get{ return _Inner; }
set{ _Inner = value; }
}
}
public partial class InnerControl : System.Web.UI.UserControl
{
// The private 'linkHref' control is declared
// in the .ascx markup of the control
public string Url
{
get { return linkHref.HRef; }
set { linkHref.HRef = value; }
}
}
的OuterControl是我Default.aspx页面上使用的是这样的:
<uc1:OuterControl ID="OuterCtrl1" runat="server">
<Inner Url="#" />
</uc1:OuterControl>
在标记上面的例子,如果我试图渲染这个页面抛出异常,因为linkHref
控件为空。使用我的调试器,我可以看到InnerControl中的每个控件都是null,但是当访问Url
属性时,InnerControl & OuterControl的OnInit()
事件还没有被触发。
UPDATE
我想添加属性 'ParseChildren
' 和 'PersistChildren
' 会有所帮助。我之前在服务器控件中使用了它们,但从未使用过用户控件,尽管效果看起来很相似。我不认为我正确解释了这两个属性的文档,但它可以阻止抛出异常。尽管页面标记会被忽略。
有没有人知道一种方法来完成这项工作。我不明白为什么这些控件在OnInit()
之前设置了值。当我尝试使用ASPX标记设置它们的值时,InnerControl
的构造函数被调用两次。一次设置基于标记的价值(我假设),并再次OnInit()
(我猜这是为什么标记值被忽略)。
这种努力是无望的,还是我只是从错误的角度接近它?
我在页面的标记中设置了HRef,而不是OnInit方法。我知道这发生在Page的OnPreInit()事件之前。我希望能够使用标记来设置控制值,因为这意味着无需重新编译即可进行更改。 – 2009-01-09 19:21:55