it-swarm.com.de

Kombinieren Sie ASP.Net MVC mit WebForms

Wäre es möglich, eine MVC-Stammanwendung (Portal mit Masterseiten und Designs) zu erstellen und einige WebForms-basierte Unterprojekte hinzuzufügen (wir haben bereits eine WebForms-Anwendung, die wir in das Portal integrieren möchten)?

Wie würden Sie die Navigation zentralisieren (Sitemaps, URL-Routing)?
Wie würden Sie die Masterseiten freigeben?
Wie würden Sie sich auf Ressourcen beziehen (~ Themen usw.)?

Lösungen wie die hier beschrieben scheinen etwas veraltet zu sein

41
Zyphrax

Die Kombination von Webformularen mit MVC ist durchaus möglich. Siehe diesen Blogbeitrag von Scott Hanselman für eine Einführung. 

42
jeroenh

Zu Referenzzwecken habe ich diese Aufgabe gestern erledigt - MVC-Funktionalität zu einer vorhandenen WebForms-Website hinzufügen. Das heißt, ich würde schreiben, falls es für jeden von Nutzen ist.

Die Leute sagen: "Der beste Weg ist, Ihre Webformulare als MVC umzuschreiben", aber es gibt oft keinen Geschäftsfall dafür, wenn die Anwendung etabliert ist und sich im Laufe der Zeit zu einem Monster entwickelt hat (das funktioniert immer noch gut, könnte ich hinzufügen.) ). In meinem Fall wurden wir gebeten, eine neue Funktion in diese Anwendung zu implementieren - und nachdem ich kürzlich in anderen Projekten in MVC entwickelt hatte, wollte ich diese neue Funktion in MVC aufbauen. Das habe ich gemacht:

  1. Erstellen Sie eine neue ASP.NET MVC 4-Anwendung und wählen Sie die Leere Vorlage (mit Rasierer) aus.

  2. Nach dem Laden klicken Sie mit der rechten Maustaste auf References > Browse und navigieren dann zum Ordner Bin meiner vorhandenen Website. Ich fügte dann in der DLL hinzu, die ich in der vorhandenen Site verwendete. Als Referenz verwende ich AjaxControlToolkit und entschied mich daher, das neueste von NuGet hinzuzufügen. Dann sollte die Datei web.config automatisch aktualisiert werden

  3. Ich öffnete dann Windows Explorer und navigierte zum Stammordner meiner vorhandenen Website. Mit Visual Studio replizierte ich dann die Ordnerstruktur der obersten Ebene der vorhandenen Site (ohne den Ordner Bin), was dazu führte, dass die beiden Sites dieselben Ordner auf der obersten Ebene haben (das neue Projekt jedoch den MVC App_Start, Controller) , Modelle und Ansichten auch Ordner, aber offensichtlich nicht Bin.

  4. Nach dem Setup kopierte ich die Unterordner und Dateien aus dem entsprechenden Ordner der obersten Ebene in Windows Explorer und fügte sie in die Projektmappe ein. Wenn Sie es auf diese Weise tun, können Sie mit dem Projekt direkt in Unterordner und Inhalte kopieren. Vorhandene Elemente können nur über Visual Studio in Kopien kopiert werden, um Zeit zu sparen. Bitte beachten Sie: Für den Stammordner habe ichNICHTin web.config oder Global.asax kopiert, aber in alle anderen Dateien (wie default.aspx usw.) kopiert.

  5. Nachdem der gesamte Inhalt kopiert wurde, habe ich web.config im neuen Projekt und web.config in der vorhandenen Site geöffnet. Ich habe alles, was für die bestehende Website spezifisch ist, in die neue web.config kopiert (AppSettings, connectionStrings, Namespaces, Informationen zur Mitgliedschaft usw.). Dasselbe gilt für die Global.asax-Dateien.

  6. Ich versuchte einen Build und reparierte alles, was ich vermisst hatte.

  7. Sobald alles stimmte (und ich hatte ein paar gelbe Bildschirme des Todes abgeschossen), bemerkte ich, dass ich beim Laden von default.aspx die Seite nicht gefunden habe. Das liegt am Routing. Hier sind die Änderungen, die ich an den Routing-Informationen vorgenommen habe (in Global.ascx MVC 3 oder App_Start> RouteConfig.cs MVC 4):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        // This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
        routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
        routes.IgnoreRoute("{resource}.aspx");
    
        // Important change here: removed 'controller = "Home"' from defaults. This is the key for loading
        // root default page. With default setting removed '/' is NOT matched, so default.aspx will load instead
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional }
        );
    }
    

Mit all diesen Schritten wurde die Website wie immer geladen und ausgeführt, aber jetzt habe ich ein ASP.NET-WebForms- und MVC-Hybrid. Ich bin sicher, dass es wahrscheinlich einfachere Wege gibt, diese Aufgabe zu erledigen, aber ich habe andere Methoden ausprobiert und bin fehlgeschlagen. Dieser Weg hat ungefähr 20 Minuten gedauert und ich war am Laufen ... gut gesessen und programmiert :)

19
Matt

Gute Antwort oben. Die andere Sache, die Sie in Betracht ziehen könnten, ist die Migration von ASP.NET zu ASP.NET MVC. In diesem Fall Dieser Beitrag kann Ihnen helfen .

5
Odd

Ich war zu fest in dieser Situation, nachdem ich eine Lösung gefunden hatte, die funktionierte, kopieren Sie zuerst web.config In Ihren Ansichtsordner.

Nach dem Öffnen der Datei Route.config(Routeconfig) finden Sie eine Methode RegisterRoutes. Behalten Sie diese bei und erstellen Sie eine andere Methode mit dem Namen RegisterRoutes2(). Kopieren Sie den folgenden Methodencode, und fügen Sie ihn ein aus der mvc-anwendung:

public static void RegisterRoutes2(RouteCollection routes)
{...}

in einigen Fällen wäre der Name der Methode in der mvc-App RegisterRoutes. Wenn der obige Code nicht funktioniert, kopieren Sie ihn und fügen Sie ihn aus der mvc-Anwendung Ihres Computers ein. Gehen Sie dann zur Datei global.asax. Dort finden Sie, dass RegisterRoutes() aufgerufen wurde. Rufen Sie jetzt einfach auch RegisterRoutes2() auf. Und wenn Sie fertig sind, starten Sie Ihre Anwendung neu oder erstellen Sie sie neu, sie wird ausgeführt.

0
Hitesh Nagpal