2 Stimmen

Konvertieren einer Seite in ein Benutzer-Control

Wenn wir eine Seite in ein Benutzersteuerelement umwandeln wollen, sollten wir auch Folgendes tun:

"Wenn Sie das Code-Behind-Modell nicht verwenden, stellen Sie sicher, dass Sie trotzdem einen Klassennamen in die Control-Direktive aufnehmen, indem Sie das ClassName-Attribut angeben. Auf diese Weise kann die Webseite, die das Steuerelement konsumiert, stark typisiert werden, wodurch sie auf Eigenschaften und Methoden zugreifen kann, die Sie dem Steuerelement hinzugefügt haben "

Ich bin mir nicht sicher, ob ich das obige Zitat verstehe:

Wenn wir nämlich keinen Code hinter der Klasse verwenden, dann wird die ascx-Klasse direkt von der UserControl-Klasse abgeleitet! Wenn wir also keinen Code hinter der Klasse verwenden, dann werden keine Methoden oder Eigenschaften zu einem Steuerelement hinzugefügt, warum sollte also eine Webseite Probleme beim Zugriff auf die Eigenschaften und Methoden eines Benutzerelements haben? Warum sollten wir also einen Klassennamen in die Control-Direktive aufnehmen?

Vielen Dank

2voto

mmx Punkte 400975

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.

1voto

J.W. Punkte 17431

wenn wir keinen Code hinter der Klasse verwenden, dann gibt es keine Methoden oder Eigenschaften zu einem Steuerelement hinzugefügt, warum also sollte die Webseite Probleme beim Zugriff auf auf die Eigenschaften und Methoden des Steuerelements Methoden? Warum sollten wir also einen Klassennamen in die Control Richtlinie

  1. Sie können jeden Code hinter Code in Ihrer .ascx/.aspx-Datei einbetten, im neuen asp.net mvc-Modell wird es standardmäßig keinen Code dahinter geben. Ich denke, Code Behind ist optional, es ist nur eine schöne Möglichkeit, eine Klasse in zwei Teile zu trennen. Partielle Klasse wird in Code behind verwendet.
  2. Auch wenn Sie keinen Code hinter der Klasse verwenden, können Sie dennoch Eigenschaften vom Basissteuerelement erben. Wenn Sie dann eine Klasse deklarieren, können Sie auch auf diese Eigenschaften zugreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X