So konvertieren Sie die ASP.NET-Website in eine ASP.NET-Webanwendung

89

Ich habe eine ASP.NET 3.5-Website (Visual Studio-Jargon), aber die Website wächst weiter und sieht unter anderem eher cowboyisch aus. Ich würde gerne sehen, dass dies in eine Webanwendung konvertiert wird (Namespaces und alle).

Ist dies etwas, das in Visual Studio leicht gemacht werden kann? Wenn nicht, gibt es andere Tools, mit denen alle Namespaces usw. automatisch erstellt werden können?

RSolberg
quelle
4
Diese Website-Vorlage ist im Vergleich zur Webanwendungsvorlage ein wirklich schrecklicher POS. Ich sehe keinen Vorteil der Verwendung der Website-Vorlage ...
James
9
@ James - nur einer von vielen Gründen, warum ich mich davon entfernen
möchte
2
Ich bin mir sicher, dass die folgende exemplarische Vorgehensweise sehr gründlich ist (ich habe nicht alles gelesen), aber eine Person auf Youtube hat hier eine sehr einfache Möglichkeit gezeigt, eine Website in eine Web-App umzuwandeln: youtube.com/watch?v=oXptokM0v7w - as Normalerweise kann ich nicht garantieren, dass dies für alle funktioniert. Ich denke, diese Methode funktioniert für Leute mit kleineren, weniger komplizierten Websites.
Legasthenikeraboko
3
Wenn Sie VS2013 verwenden, vergessen Sie nicht, dass der Menüpunkt verschoben wurde .
Jon

Antworten:

108

Nun, es stellt sich heraus, dass die Option "In Webanwendung konvertieren" für "Websites" NICHT vorhanden ist. Die Option "In Webanwendung konvertieren" gibt es nur für "Webanwendungen" !!!!

[Hervorhebung von mir]

Also, hier ist der Deal, um die Konvertierung durchzuführen, müssen Sie:

  • Fügen Sie Ihrer VS 2008-Lösung eine neue "Webanwendung" hinzu (Datei-> Hinzufügen-> Neues Projekt-> C # -> Web-> ASP.NET-Webanwendung).

  • Anschließend kopieren Sie alle Dateien auf der alten "Website" in Ihre neu erstellte "Webanwendung" und überschreiben alle darin standardmäßig erstellten Dateien

  • Der nächste Schritt ist der hässlichste. Sie müssen die Referenzen in Ihrer "Website" "manuell" zur neuen "Webanwendung" hinzufügen. Ich dachte, das VS 2008 PowerCommands-Spielzeug würde dies für mich tun, da es Referenzen von anderen Projekttypen kopiert, aber das tat es nicht. Sie müssen dies manuell selbst tun und in diesem Schritt vorsichtig sein, wenn Sie mehrere Versionen derselben Assembly (wie in meinem Fall AJAXToolkit) oder Assemblys mit GAC- und lokalen Versionen haben.

  • Wiederholen Sie den letzten Schritt und versuchen Sie, die "Webanwendung" zu erstellen. Sie erhalten immer wieder Fehler wie "'....' ist ein unbekannter Namespace. Fehlt Ihnen eine Assemblyreferenz?". Stellen Sie sicher, dass Sie keine haben, außer denjenigen, bei denen '....' durch die IDs der von Ihnen verwendeten Serversteuerelemente ersetzt wird. Mit anderen Worten, fügen Sie weitere Referenzen hinzu und erstellen Sie das Projekt, bis nur noch die Fehler vorliegen, die aufgrund fehlender .DESIGNER.CS- oder .DESIGNER.VB-Dateien vorliegen.

  • Wechseln Sie anschließend im VS 2008 Solution Explorer zum Stammprojektknoten "Webanwendung" und klicken Sie mit der rechten Maustaste darauf. Anschließend finden Sie die Option "In Webanwendung konvertieren". Mit dieser Option werden kleine Änderungen an den Anweisungen "@Page" und "@Control" von Seiten und Steuerelementen vorgenommen und die erforderlichen .DESIGNER.CS- oder .DESIGNER.VB-Dateien erstellt.

  • Versuchen Sie erneut, die "Webanwendung" zu erstellen. Wenn Sie Fehler erhalten, überprüfen Sie, welche Referenzen möglicherweise fehlen, und / oder klicken Sie erneut auf "In Webanwendung konvertieren". Wenn andere Fehler als die fehlenden DESIGNER-Dateien auftreten, werden diese DESIGNER-Dateien manchmal nicht für alle Seiten / Steuerelemente erstellt. Das Beheben des Nicht-DESIGNER-Problems und das erneute Klicken auf "In Webanwendung konvertieren" sollten den Job dafür erledigen.

  • Sobald Sie den VS-Build erfolgreich abgeschlossen haben, sollten Sie bereit sein. Testen Sie Ihre Webanwendung. Optional können Sie im VS 2008-Projektmappen-Explorer mit der rechten Maustaste auf den Stammprojektknoten "Webanwendung" klicken und auf "Eigenschaften" klicken. Wechseln Sie dann zur Registerkarte "Web", um die "Webanwendung" in einem virtuellen Ordner in IIS festzulegen (Sie können neue erstellen virtuelles Verzeichnis von dort in VS). Wenn Sie das virtuelle IIS-Verzeichnis verwenden möchten, das von der alten "Website" verwendet wurde, müssen Sie dieses zuerst aus IIS entfernen.

  • Update: Achten Sie beim Testen Ihrer Seiten besonders auf Klassen im Ordner "App_Code", insbesondere auf Klassen ohne NAMESPACE. Das kann eine große Falle sein. Wir hatten ein Problem mit zwei Überladungen von Erweiterungsmethoden in derselben statischen Klasse, die keinen Namespace hatten. Eine erweitert DateTime? (Nullable) und ruft eine weitere Überladung auf, die DateTime selbst erweitert. Das Aufrufen der anderen Überladung als Erweiterungsmethode hat die VS 2008-Kompilierung bestanden und uns NUR IN RUNTIME (mit IIS) einen Kompilierungsfehler gegeben. Das Ändern des Aufrufs auf die andere Überlastung vom Aufrufen als Erweiterungsmethode zum Aufrufen als normale statische Methode (nur das Ändern des Aufrufs in derselben Klasse, Aufrufe von anderen Klassen blieben Aufrufe der Erweiterungsmethode) hat dieses Problem gelöst, aber es ist eindeutig nicht so sicher wie früher in VS 2005.

  • Update2: Während der Konvertierung benennt VS 2008 Ihren "App_Code" in "Old_App_Code" um. Dieser neue Name klingt hässlich, aber benennen Sie ihn nicht zurück. Im Modell "Webanwendung" befindet sich der gesamte Code in einer Assembly. Zur Laufzeit weiß der Webserver nicht, welchen Webprojekttyp Sie verwenden. Es nimmt den gesamten Code im Ordner "App_Code" und erstellt eine neue Assembly dafür. Wenn Sie Code im Ordner "App_Code" haben, treten auf diese Weise RUNTIME-Kompilierungsfehler auf, die in zwei Assemblys vorhanden sind, die von VS und die von IIS / ASP.NET Development Server erstellt wurden . Um das zu vermeiden. Belassen Sie den "Old_App_Code" mit demselben Namen oder benennen Sie ihn in "ALLES AUS, AUSSER" App_Code "um. Platzieren Sie keinen Code in einem solchen "App_Code".

Ich weiß das schon vorher, habe es aber jetzt vergessen, da ich das "Website" -Modell schon lange nicht mehr verwendet habe :(.

Andrew Hare
quelle
2
Ihr Link ist oben unterbrochen, Fehler 500
Sameer Alibhai
6
Suchen Sie auch
14
Für diejenigen unter Ihnen, die dies in VS2013 tun, wurde "In Web-App verdecken" in das Menü "Projekt" unten verschoben.
Eric Sassaman
3
@EricSassaman Aber es ist überhaupt nicht für Website-Projekte für mich da.
NickG
1
@NickG, Sie haben Recht, gemäß der ersten Zeile der Antwort ist es NICHT für Website-Projekte vorhanden. Das Menü Projekt ist nur vorhanden, wenn Sie im Projektmappen-Explorer eine Webanwendung auswählen. Wenn im Menü "Website" angezeigt wird, handelt es sich nicht um eine Webanwendung. Führen Sie die obigen Schritte aus, um eine leere Webanwendung zu erstellen, und kopieren Sie Ihre Dateien in diese. Dann sollte "In Webanwendung konvertieren" im Projektmenü für Ihre neue Webanwendung angezeigt werden. Hast du das gemacht?
Eric Sassaman
5

Wenn Sie Probleme beim Erstellen Ihres neuen Webanwendungsprojekts haben, überprüfen Sie die Dateieigenschaften aller Hilfsklassen in Visual Studio. Für ein Projekt, das ich konvertierte, wurde die Build-Aktion auf "Inhalt" gesetzt, während es "Kompilieren" sein sollte.

Matt Burrell
quelle
3

Erstellen Sie eine neue Webanwendung in VS 2010.
1. Kopieren Sie mit Windows Explorer alle Ihre Dateien in Ihren Projektordner.
2. Zeigen Sie im VS 2010 Solution Explorer alle Dateien an.
3. Wählen Sie die Dateien und Ordner aus - klicken Sie mit der rechten Maustaste auf In Projekt einschließen.
4. Klicken Sie mit der rechten Maustaste auf den Projektlösungs-Explorer und wählen Sie In Webanwendung konvertieren.

Es gibt einige kleine Unterschiede, z. B. wird der App_Code-Ordner in old_app_code umbenannt - was überraschenderweise keine Fehler verursacht. Der Typname in Ihren Objektdatenquellen und die Vererbungen im @ Page-Tag benötigen möglicherweise den [Projektnamen]. Präfix global angehängt. Wenn Ihr Typname beispielsweise "BusinessLogic.OrderManager" und Ihr Projektname "InventorySystem" lautet, müssen Sie ihn in "InventorySystem.BusinessLogic.OrderManager" ändern. Einige Anzeigeänderungen, wie z. B. erforderliche Feldprüfer, verwenden nicht mehr standardmäßig die rote Schrift, sondern standardmäßig die schwarze.

Tim Samandari
quelle
Meine App-Code-Datei hat sich nicht so geändert, wie es angenommen wurde. Ich musste es manuell umbenennen und dann alle cs-Seiten zum Kompilieren ändern.
Mike
3

Ich hatte anfangs die gleichen Probleme. Nachdem ich dem Wrox Professional ASP.NET 4.0-Buch gefolgt war, fand ich die folgende Lösung für meinen Fall.

Ich habe zuerst eine neue Webanwendung erstellt. Kopierte alle Website-Dateien in den Webanwendungsordner. Klicken Sie mit der rechten Maustaste auf die Anwendung und klicken Sie auf In Webanwendung konvertieren.

Möglicherweise fragen Sie, warum Sie eine Web-App in eine Web-App konvertieren müssen. Die Antwort lautet: Wenn Sie eine Website erstellen, codieren Sie einfach die CS-Datei, wo immer dies erforderlich ist. Eine Webanwendung deklariert jedoch automatisch .design.cs (oder .vb) und eine .cs-Datei für den Code- und Designabschnitt.

NÄCHSTER: Entfernen Sie alle manuellen Verweise wie das Attribut 'Inherits' in der PAGE-Direktive auf andere Dateien auf Ihrer Website, da in Namensräumen die Klassen zentral referenziert werden.

Ich hatte auch ein Problem, da ich OBJ und BIN nicht in mein Projekt aufgenommen hatte. Wenn Sie glauben, dass Ihre BIN- und OBJ-Ordner fehlen, klicken Sie einfach im Projektmappen-Explorer auf das Symbol "Alle Dateien anzeigen", klicken Sie mit der rechten Maustaste auf die fehlenden Ordner und fügen Sie sie dem Projekt hinzu. (um sicherzustellen, dass sie mit dem Projekt kompiliert werden.)

UPDATE: Wie @deadlychambers in den Kommentaren hervorhebt: Sie können überall suchen, indem Sie "Strg + Umschalt + F" drücken und dann nach suchen Inherits="(.*?)". Dies wird alle Vorkommen finden und Ihnen wahrscheinlich einige Zeit sparen!

Sunny R Gupta
quelle
1
Sie können alle mit Strg-Umschalt-F entfernen und dann die Suchoptionen für reguläre Ausdrücke ändern und diese Inherits = "(. *)?"
DeadlyChambers
1
Überprüfen Sie, ob es sich um Inherits = "(. *?)" Handelt. Der andere greift bis zum letzten Anführungszeichen auf alles, was hinter den Erben steckt.
DeadlyChambers
1
Ich bin gerade auf ein Problem gestoßen, bei dem der Designer durch das Fehlen von Erben den Namespace und dann die Klasse löschte. Ich wünschte, das wäre einfacher.
DeadlyChambers
3

Ich habe jetzt erfolgreich ein Website-Projekt in eine Webanwendung migriert und es gibt ein paar Fallstricke, auf die Sie achten müssen.

Wenn Sie ReSharper zur Verfügung haben, können Sie die Aspx-Dateien erheblich überarbeiten.

  1. Richten Sie Ihre Lösung ein und erstellen Sie eine leere Webanwendung
  2. Kopieren Sie alle Dateien über
  3. aspx-Dateien in Website-Projekten haben keinen Namensraum. Wickeln Sie Ihre Klassen in die entsprechenden Namespaces ein
  4. Während des Kopierens wurden alle meine Seiten in Unterordnern in meinen Projektnamen und den Ordnernamen umbenannt, sodass ich 40ish erhielt, public partial class FolderName_Projectname : Pagewenn erforderlich, alle Dateien mit Resharper oder manuell umbenennen. Wenn Sie auf mehrere Fehler stoßen "There is already a member Page_Load() defined", ist dies höchstwahrscheinlich auf falsche Klassennamen und Duplikate zurückzuführen
  5. Nach dem Hinzufügen eines Namespace
  6. Ersetzen Sie CodeFilein allen Aspx-Seiten durch Codebehindund achten Sie besonders auf Dateien in Ihrem Unterordner. Stellen Sie sicher, Inhertis=""dass der relative Pfad nicht enthalten ist. Ihre Namespaces kümmern sich um alles. Das richtige Format ist also Inherits="Namespace.classname". Wenn Ihre Klasse einen Namespace NaSpa und einen Dateinamen foo.cs hat, wäre dies der FallInherits="NaSpa.foo"

  7. Nachdem Sie alle Ihre Dateien vorbereitet haben (vergessen Sie nicht Ihre Masterseiten), führen Sie "In Webanwendung konvertieren" aus. Wenn Sie danach auf Fehler stoßen, spülen Sie und wiederholen Sie. Wenn Sie auf Fehler der Art "TextBoxName kann nicht gefunden werden, wenn Sie eine Referenz vermissen" stoßen, stellen Sie sicher, dass Sie nicht vergessen haben, Ihre Aspx-Seiten zu bereinigen. Ein guter Indikator ist die Überprüfung der automatisch generierten Designer-Dateien. Wenn TextBoxNamedort nicht angezeigt wird, war die Konvertierung nicht vollständig erfolgreich.

  8. Beheben Sie fehlende Abhängigkeiten.
  9. Bauen
Marco
quelle
0

Der Standard-ASP-Namensraum scheint nicht mehr zu funktionieren. Daher kann ich meine User Controls.ascx-Seiten scheinbar nicht von außerhalb der Seite aufrufen. Es schien zu funktionieren, ihnen einen Namespace zu geben und den Standardwert von ASP in meinen Namespace zu ändern.

Mike
quelle