【发布时间】:2010-09-30 13:28:58
【问题描述】:
更新: 我一直在试验我的控件,我想我已经接近了。请继续阅读以获取最新信息。
我有 2 个 ASP.NET 2.0 用户控件,其中一个放置在另一个 内部。在内部控件内部,我有一个 HtmlAnchor 标记控件,我正在尝试为外部控件设置 URL。当我尝试从呈现页面的标记中设置HRef 属性时,HtmlAnchor 控件为null 并引发异常。
URL set 属性被调用在内部或外部控件的 OnInit 事件之前以及主页的“OnPreInit”事件之前。我假设这是因为我在渲染控件的页面上的父控件标记中设置子控件的 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 中的每个控件都是空的,但是当访问 Url 属性时,InnerControl 和 OuterControl 的 OnInit() 事件都没有被触发。
更新
我认为添加属性“ParseChildren”和“PersistChildren”会有所帮助。我以前在服务器控件中使用过它们,但从未在用户控件中使用过,尽管效果似乎相似。我认为我没有正确解释这两个属性的文档,但它可以阻止抛出异常。但是页面标记会被忽略。
有没有人知道如何进行这项工作。我不明白为什么这些控件会在OnInit() 之前设置值。当我尝试使用 ASPX 标记设置它们的值时,InnerControl 的构造函数被调用了两次。一次根据标记设置值(我假设),然后再次在OnInit() 上设置值(我猜这就是为什么标记值被忽略的原因)。
这种努力是没有希望的还是我只是从错误的角度接近它?
【问题讨论】:
标签: c# .net asp.net user-controls controls