Combine ASP.Net MVC with WebForms

Is it possible to create a MVC root application (Portal with masterpages and themes) and add a couple of WebForms based subprojects (we already have an existing WebForms application that we would like to integrate into the Portal)?

How would you centralize navigation (sitemaps, url routing)? How would you share the masterpages? How would you refer to resources (~ issues etc.)?

Answers


Combining web forms with MVC is entirely possible. See this blog post by Scott Hanselman for an introduction.


For reference I managed to accomplish this task yesterday - add MVC functionality to an existing WebForms website, that is - so thought I would write in case it is of any use to anybody.

People say: "the best way is to rewrite your web forms application as MVC" but there is often no business case for this when the application is well established and has grew over time to be quite a monster (that still works well I might add). In my case, we had been asked to implement a new function into this application - and having been developing in MVC on other projects recently - I wanted to build this new function in MVC. This is what I did:

  1. Create a new ASP.NET MVC 4 Application and selected the Empty Template (with Razor)

  2. Once loaded, right-clicked References > Browse and then navigated to the Bin folder of my existing website. I then added in the DLL's I was using in the existing site. For reference, I am using AjaxControlToolkit so decided to add in the latest one from NuGet. This should then auto-update the web.config file

  3. I then opened up Windows Explorer and navigated to the root folder of my existing website. Using Visual Studio, I then replicated the top-level folder structure of the existing site (minus the Bin folder) resulting in the 2 sites having the same top-level folders (but the new project having the MVC App_Start, Controllers, Models and Views folders also, but not Bin obviously).

  4. Once setup, I copied the sub-folders and files from the corresponding top-level folder in Windows Explorer and pasted them into the solution. If you do it the way, the project allows you to copy in sub-folders and content directly, adding existing item via visual studio only copies in files thus saving time. Please note: for the root folder, I did NOT copy in web.config or Global.asax, but copied in all other files (like default.aspx, etc)

  5. Once all content was copied, I opened up web.config in the new project and web.config in the existing site. I copied into the new web.config anything specific to the existing website (appSettings, connectionStrings, namespaces, membership info, etc). The same applied to the Global.asax files.

  6. I attempted a build and fixed anything I'd missed.

  7. Once everything was right (and I had shot down a few Yellow screens of death) I noticed that I got the page not found error when loading default.aspx. This is down to routing, here is the changes I made to the Routing info (located in Global.ascx MVC 3, or 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 }
        );
    }
    

With all these steps taken, the site loaded and ran as it always did, but I now have a ASP.NET WebForms and MVC hybrid. I am sure there are probably easier ways of accomplishing this task, but I tried other methods and failed. This way took me around 20 minutes and I was up and running... well sat and coding :)


Great answer above. The other thing you could consider is migrating from ASP.NET to ASP.NET MVC, in which case this post might help you migrate the project files.


I was too stucked in this situation, after all i got a solution which worked, first of all copy web.config in your views folder.

After that open Route.config(Routeconfig) file, there you will find one method RegisterRoutes, keep it as it is and create another method named RegisterRoutes2(), and copy paste the below method code from the mvc application:

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

in some cases method name in mvc app would be RegisterRoutes. If above code does not work, copy paste it from your machine’s mvc application. Then, go to global.asax file, ther you will find RegisterRoutes() has been called, simple now , also call RegisterRoutes2(). And you are done, restart your application, or clean build, it will run.


Need Your Help

Storing arrays in Set and avoiding duplicates

java arrays generics hash set

HashSet<String[]> boog = new HashSet<String[]>();

ASCIIEncoding In Windows Phone 7

c# windows-phone-7 encoding ascii

Is there a way to use ASCIIEncoding in Windows Phone 7?