ОБНОВЛЕНИЕ: Я немного поэкспериментировал со своими элементами управления и думаю, что стал ближе. Пожалуйста, ознакомьтесь с обновленной информацией.
У меня есть 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
имеет значение null. Используя мой отладчик, я вижу, что каждый элемент управления в InnerControl имеет значение null, но событие OnInit()
InnerControl и OuterControl еще не было запущено при обращении к свойству Url
.
UPDATE
Я думал, что добавление атрибутов 'ParseChildren
' и 'PersistChildren
' поможет. Я использовал их в элементах управления сервером раньше, но никогда в пользовательских элементах управления, хотя эффект, похоже, похож. Я не думаю, что правильно интерпретирую документацию по этим двум свойствам, но это может помешать выбросу исключений. Однако разметка страницы игнорируется.
Кто-нибудь знает способ получить эту работу. Я не понимаю, почему эти элементы управления получают значения, установленные до OnInit()
. Когда я пытаюсь установить их значения с помощью разметки ASPX, конструктор для InnerControl
вызывается дважды. Один раз, чтобы установить значения, основанные на разметке (я предполагаю), и снова на OnInit()
(что я предполагаю, почему значения разметки игнорируются).
Это усилие безнадежное или я просто подхожу к нему с неправильного угла?