This is a blog-in-progress while I try to convert an ASP.NET WebForms application to MVC 4. It may completely fail or I may give up, but I thought it might help to share my experiences.
What I am Migrating
My bright idea is not to convert. I don’t think that’s the easiest route, I just don’t know what’s needed for an MVC app, and I want the IDE to be in MVC mode, with the context menu support for views and stuff, which probably won’t happen if I just add some DLL references and setup some routing.
So, I will make a new, empty MVC 4 app and copy in the files from the old world. I know MVC is happy to serve-up ASPX forms pages and controls, and that’s all a WebForms site is – just some ASPX pages and some handlers, maybe some URL rewriting.
So far, I have:
- Created an empty, new ASP.NET MVC 4.0 project.
- Set the same project references and NuGet packages.
- Set my solution and project configurations for staging/QA.
- Copied over all the stuff from the old Web.config that I think are non-standard, i.e. added to support the old app. I already did this, so its hard to blog at detail but its actually pretty simple.
- Begun to copy over the basic, high-in-the-dependency-graph controls and pages.
Copying Stuff Across
I have copied /MasterPages and its children, /Classes which are just some .cs files with helpers inside, /Controls which are Web User Controls or ASCX files as well as the default.aspx (all come with their code-behind and designer).
Problem 1 – Solved
In copying the files, drag and drop, from the WebForms project in the same solution, the IDs of the controls on the ‘pages’ (in the ASPX or ASCX files) are not being ‘seen’ in the code-behind. By that, I mean there are red squigglies in the C# wherever they are referenced – its like the controls on the pages are not being compiled.
I reconstructed a control manually, by adding a new one with a different name and copying over the important mark-up and code. This was fine, so MVC is cool with it, just doesn’t like it being copied file by file.
So I figured that it must be related to the designer file. The file doesn’t sit at the same level in the Solution Explorer as the manually created good one, so there’s something odd going on. Opening the designer.cs file is fine but the code doesn’t respond to mouse-overs – its lifeless like a text file.
Solution: The trick is to delete the file and then right-click its parent AS?X file and hit Convert to Web Application which forces regeneration of the designer.cs.
You can copy a load in and then convert at the folder or project level, too, donchaknow.
Problem 2 – Solved
The default route and getting default.aspx to be the page shown at the domain root. This one is easy, although I’m not sure its the proper way. Simple add this route.
routes.MapPageRoute("HomePage", "", "~/default.aspx");
Problem 3 – Solved
Settings in httpHandlers not working, i.e. still going via the routing system. So this site has a load of magic setup in the web.config to make friendly-URLs happen. Of course, this needs to be re-considered in an MVC world, but we’re talking about things like blah.xml which invokes a special handler – its all custom stuff for this old site.
The solution was two step:
- Add the following line to not route requests:
- Also need to update the types in the httpHandlers section in web.config
<add verb="*" path="*.xml" type="Company.XmlHandler, SiteDllFile" />
<add verb="*" path="*.xml" type="Company.XmlHandler, NewMvcSiteDllFile" />
The form values security and validation seems to have been tightened-up in ASP.NET 4.0 or something, because I was getting an exception when reading Form values containing XML fragments. This was remedied with this config setting:
Problem 5 – At this stage, there has been no problem 4
With everything else copied over and some shared components refactored out into a shared library, everything else is working.Labels: aspnet, programming, web