Ich denke, ich sollte klarstellen, wie das Kompilierungsmodell funktioniert. Zunächst einmal können Sie alles (einschließlich C#-Code) in einer einzigen .ascx
Datei und erben von der gewünschten Klasse (die letztendlich von UserControl
) durch Angabe von Inherits
Attribut (oder Sie können es weglassen) und ohne ein ClassName
Attribut. Wenn Sie dies tun, können Sie immer noch auf die Eigenschaften aus der .aspx
Datei, die dieses Steuerelement verwendet. Das Problem ist, dass Sie die Klasse nicht in der Codebehind-Datei von .aspx
Seite (falls sie eine hat) direkt. Durch die Angabe der ClassName
Wenn Sie das Website-Projektmodell von Visual Studio verwenden, können Sie es über das Menü .aspx.cs
Datei zu. Beachten Sie, dass dies in einem Webanwendungsprojektmodell nicht funktionieren würde, da jede .cs
Datei wird vor der Zeit kompiliert (vor der .ascx
Datei). In diesem Fall kann sogar ClassName
Attribut nicht viel helfen würde.
In jedem Fall ist keines der Attribute unbedingt erforderlich. Sie können immer die Eigenschaften verwenden, die irgendwo in .ascx
o .ascx.cs
Datei, die in einer Seite in der .aspx
Datei (aber no immer .aspx.cs
Datei).
Bearbeiten, um auf die Aktualisierung der Frage einzugehen:
A) Aus Ihrem Quellcode geht hervor, dass Sie hier das Website-Modell verwenden. Beachten Sie, dass ich erwähnt habe, dass Sie nicht das Klasse direkt. Ich stimme zu, dass diese Aussage ein wenig irreführend gewesen sein könnte. Was ich damit sagen wollte, ist, dass ohne eine ClassName
ASP.NET wählt einen Namen für Ihre Benutzerkontrollklasse, aber dieser Name ist nicht garantiert. Während Sie peut den generierten Namen zu verwenden, ist überhaupt nicht empfehlenswert. Sie sollten ihn so ähnlich wie einen anonymen Typ behandeln, bei dem Sie eine Instanz verwenden können, aber keinen Namen angeben dürfen. In Ihrem Beispiel verweisen Sie im Grunde auf eine Instanz (die auf der .aspx
Markup), nicht die Klasse was in Ordnung ist.
B) Was Sie sagen, ist richtig. Was auch immer Sie erklären in ascx.cs
in einer Webanwendung werden sichtbar für .aspx.cs
y .aspx
. Was ich meinte, sind Eigenschaften, die Sie in .ascx
in einem <script runat="server">
Tag. Diese werden nicht sichtbar sein für .aspx.cs
da sie vorher kompiliert wird.
C) ASP.NET generiert die Klasse, die durch die ClassName
Attribut in der Datei ASP
Namensraum. Sie sollten ASP.Some_Name
stattdessen. Eine Sache habe ich vergessen zu erwähnen: In diesem Fall sollten Sie irgendwie auf die .ascx
en el .aspx
Markup; entweder mit einer Reference
Richtlinie ( <%@ Reference Control="MyControl.ascx" %>
) oder mit einer Register
Richtlinie ( <%@ Register TagPrefix="abc" TagName="xyz" Src="MyControl.ascx" %>
). Dadurch wird sichergestellt, dass die ASP.NET-Build-Engine die generierten .ascx
Klasse in der gleichen Baugruppe wie .aspx
Seite.