UPDATE:Ich habe mit meinen Kontrollen etwas mehr experimentiert und ich denke, dass ich näher gekommen bin. Bitte lesen Sie weiter für aktualisierte Informationen.Warum werden untergeordnete Elemente meines benutzerdefinierten Benutzersteuerelements nicht initialisiert?
Ich habe 2 ASP.NET 2.0 Benutzersteuerelemente, von denen eine innerhalb des anderen platziert wird. Innerhalb der inneren Kontrolle habe ich eine HtmlAnchor
Tag-Kontrolle, die ich versuche, eine URL für die äußere Kontrolle festzulegen. Wenn ich versuche, die HRef
-Eigenschaft von der Wiedergabeseite Markup festzulegen, ist das HtmlAnchor
Steuerelement null
und löst eine Ausnahme aus.
Die URL set
Eigenschaft ist vor entweder den inneren dem OnInit Ereignis aufgerufen wird oder die äußeren Kontrolle und vor der Haupt Seite ‚OnPreInit
‘ Ereignis. Ich nehme an, dass das ist, weil ich die URL des Kindsteuerelements im Markup des Elternsteuerelements auf der Seite setze, auf der ich die Steuerelemente rendere, was bedeutet, dass der Wert vor OnInit()
gesetzt wird. Hier ist die (abgespeckte) Version des Codes Ich verwende:
[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; }
}
}
Die OuterControl auf meiner Seite Default.aspx wie folgt verwendet:
<uc1:OuterControl ID="OuterCtrl1" runat="server">
<Inner Url="#" />
</uc1:OuterControl>
Im Markup-Beispiel oben, wenn Ich versuche, diese Seite eine Ausnahme auszulösen wird geworfen, weil das Steuerelement null ist. Mit meinem Debugger kann ich sehen, dass jedes Steuerelement innerhalb der InnerControl ist Null, aber beide InnerControl & OuterControl OnInit()
Ereignis wurde noch nicht ausgelöst, wenn die Url
Eigenschaft zugegriffen wird.
UPDATE
Ich dachte, die Attribute 'ParseChildren
' und 'PersistChildren
' helfen würde hinzufügen. Ich habe sie zuvor in den Serversteuerelementen verwendet, aber nie in den Benutzersteuerelementen, obwohl der Effekt ähnlich zu sein scheint. Ich denke nicht, dass ich die Dokumentation für diese beiden Eigenschaften richtig interpretiere, aber es kann verhindern, dass Ausnahmen ausgelöst werden. Die Seitenmarkierung wird jedoch ignoriert.
Kennt jemand einen Weg, um diese Arbeit zu haben. Ich verstehe nicht, warum diese Steuerelemente Werte erhalten, die vor OnInit()
festgelegt sind. Wenn ich versuche, ihre Werte mithilfe des ASPX-Markups festzulegen, wird der Konstruktor für InnerControl
zweimal aufgerufen. Einmal, um die Werte basierend auf dem Markup (ich nehme an) und wieder auf OnInit()
(was ich vermute, warum die Markup-Werte ignoriert werden).
Ist diese Anstrengung hoffnungslos oder komme ich gerade aus dem falschen Winkel?
Ich setze HRef in den Markup der Seite, nicht die OnInit-Methode. Ich weiß, dass dies vor dem Ereignis OnPreInit() der Page geschieht. Ich möchte in der Lage sein, das Markup zu verwenden, um Kontrollwerte zu setzen, wenn es möglich ist, da es bedeutet, dass ich nicht neu kompilieren muss, um Änderungen vorzunehmen. –