Mixing ASP.net and MVC

download Mixing ASP.net and MVC

of 5

Transcript of Mixing ASP.net and MVC

  • 8/14/2019 Mixing ASP.net and MVC

    1/5

    Mixing ASP.NET Webforms and ASP.NET MVCEver since Microsoft started working on the ASP.NET MVC framework, one of the primary concerns wasthe framework's ability to re-use as many features as possible from ASP.NET Webforms. In this articlebyMaarten Balliauw, we will see how we can mix ASP.NET Webforms and ASP.NET MVC in oneapplication and how data is shared between both these technologies.

    Not every ASP.NET MVC web application will be built from scratch. Several projects will probably end up migratingfrom classic ASP.NET to ASP.NET MVC. The question of how to combine both technologies in one application arisesisit possible to combine both ASP.NET Webforms and ASP.NET MVC in one web application? Luckily, the answer is yes.

    Combining ASP.NET Webforms and ASP.NET MVC in one application is possiblein fact, it is quite easy. The reasonfor this is that the ASP.NET MVC framework has been built on top of ASP.NET. There's actually only one crucialdifference: ASP.NET lives in System.Web, whereas ASP.NET MVC lives in System.Web, System.Web.Routing,System.Web.Abstractions, and System.Web.Mvc. This means that adding these assemblies as a reference in anexisting ASP.NET application should give you a good start on combining the two technologies.

    Another advantage of the fact that ASP.NET MVC is built on top of ASP.NET is that data can be easily shared betweenboth of these technologies. For example, the Session state object is available in both the technologies, effectivelyenabling data to be shared via the Session state.

    Plugging ASP.NET MVC into an existing

    ASP.NET applicationAn ASP.NET Webforms application can become ASP.NET MVC enabled by following some simple steps. First of all, adda reference to the following three assemblies to your existing ASP.NET application:

    System.Web.Routing

    System.Web.Abstractions

    System.Web.Mvc

    After adding these assembly references, the ASP.NET MVC folder structure should be created. Because the ASP.NET

    MVC framework is based on some conventions (for example, controllers are located in Controllers), theseconventions should be respected. Add the folder Controllers, Views, and Views | Shared to your existing ASP.NETapplication.

    The next step in enabling ASP.NET MVC in an ASP.NET Webforms application is to update the web.config file, with thefollowing code:

    < ?xml version="1.0"?>

  • 8/14/2019 Mixing ASP.net and MVC

    2/5

    System.Web.Routing, Version=3.5.0.0,

    Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

    Note that your existing ASP.NET Webforms web.config should not be replaced by the above web.config! Theconfigured sections should be inserted into an existing web.config file in order to enable ASP.NET MVC.

    There's one thing left to do: configure routing. This can easily be done by adding the default ASP.NET MVC's globalapplication class contents into an existing (or new) global application class, Global.asax.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.Web.Mvc;

    using System.Web.Routing;

    namespace MixingBothWorldsExample

    {

    public class Global : System.Web.HttpApplication

    {

    public static void RegisterRoutes(RouteCollection routes)

    {

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");routes.MapRoute(

    "Default",

    // Route name

    "{controller}/{action}/{id}",

    // URL with parameters

    new { controller = "Home", action = "Index", id = "" }

    // Parameter defaults

    );

    }

    protected void Application_Start()

    {

    RegisterRoutes(RouteTable.Routes);

    }

    }

    }

    This code registers a default ASP.NET MVC route, which will map any URL of the form/Controller/Action/Idinto acontroller instance and action method. There's one difference with an ASP.NET MVC application that needs to benoteda catch-all route is defined in order to prevent a request for ASP.NET Webforms to be routed into ASP.NETMVC. This catch-all route looks like this:

    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

    This is basically triggered on every request ending in .aspx. It tells the routing engine to ignore this request and leaveit to ASP.NET Webforms to handle things.

    With the ASP.NET MVC assemblies referenced, the folder structure created, and the necessary configurations in place,we can now start adding controllers and views. Add a new controller in the Controllers folder, for example, thefollowing simpleHomeController:

    using System.Web.Mvc;

    namespace MixingBothWorldsExample.Controllers

    {

    public class HomeController : Controller

    {public ActionResult Index()

    {

    ViewData["Message"] = "This is ASP.NET MVC!";

    return View();

    }

    }

    }

    The above controller will simply render a view, and pass it a message through the ViewData dictionary. This view,located in Views | Home | Index.aspx, would look like this:

  • 8/14/2019 Mixing ASP.net and MVC

    3/5

    The above view renders a simple HTML page and renders the ViewData dictionary's message as the page title.

    ASP.NET MVC 1.0 Quickly

    Plugging ASP.NET into an existing ASP.NETMVC applicationThe road to enabling an existing ASP.NET MVC web application to serve ASP.NET Webforms contents is actually quiteeasy. Because the ASP.NET MVC framework is built on top of ASP.NET Webforms, any classic web form will

    automatically be available from an ASP.NET MVC web application. This means that any ASPX file will be renderedusing ASP.NET Webforms, unless the route table contains a matching route for handling an ASP.NET MVC request.

    To avoid strange results in a mixed application, consider adding a catch-all route to the route table for ASPX pages,which will ignore any requests to ASP.NET Webforms, and will route only ASP.NET MVC requests. This can be done inthe global application class, Global.asax.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.Web.Mvc;

    using System.Web.Routing;

  • 8/14/2019 Mixing ASP.net and MVC

    4/5

    namespace MixingBothWorldsExample

    {

    public class Global : System.Web.HttpApplication

    {

    public static void RegisterRoutes(RouteCollection routes)

    {

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");routes.MapRoute(

    "Default",

    // Route name

    "{controller}/{action}/{id}",

    // URL with parameters

    new { controller = "Home", action = "Index", id = "" }

    // Parameter defaults

    );

    }

    protected void Application_Start()

    {

    RegisterRoutes(RouteTable.Routes);

    }

    }

    }

    The above code registers a default ASP.NET MVC route, which will map any URL in the form/Controller/Action/Idintoa controller instance and action method. The catch-all route for ASP.NET Webforms looks like this:

    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

    Sharing data between ASP.NET and

    ASP.NET MVCWhether you are creating a new mixed ASP.NET Webforms-ASP.NET MVC applicationor doing a migration, thechances are that you will need to share data between the two technologies. For example, a form can be posted by anASP.NET Webforms page to an ASP.NET MVC action method.

    Because the ASP.NET MVC framework is built on top of ASP.NET Webforms, the following objects are always availablein both technologies:

    1. HttpContext

    2. Session

    3. Server

    4. Request

    5. Response

    6. Cookies

    This way, it is easy to set a Session state item in classic ASP.NET Webforms and read it in ASP.NET MVC.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    namespace MixingBothWorldsExample{

    public partial class _Default : System.Web.UI.Page

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    Session["SharedData"] = "This message is set by classic

    ASP.NET.";

    }

    }

    }

  • 8/14/2019 Mixing ASP.net and MVC

    5/5

    The above code is a "codebehind" for a classic ASP.NET page. As you can see, it sets the SharedData dictionary itemofSession to a string value. This data can easily be read easily in an ASP.NET MVC controller, for example:

    using System.Web.Mvc;

    namespace MixingBothWorldsExample.Controllers

    {

    public class HomeController : Controller

    {

    public ActionResult Index()

    {

    ViewData["Message"] = "This is ASP.NET MVC!";

    ViewData["SharedData"] = Session["SharedData"] ?? "";

    return View();

    }

    }

    }

    The Indexaction method tries to read data from the SharedData dictionary item of Session. If it has been set byASP.NET Webforms or ASP.NET MVC, it is assigned to the ViewData dictionary. In other cases, an empty string ispassed in.

    Building views at compile timeBy default, the views in ASP.NET MVC applications are built the first time that a request comes in. This means that ifthere is a compilation error in a view, it will only be visible the first time that a user requests for that view to be

    rendered. To overcome this issue, views can be compiled whenever the ASP.NET MVC application is compiled.

    To build views at compile time, the following steps should be executed:

    1. Open the project file in a text editor. For example, start Notepad and open the project file for your ASP.NETMVC application (that is, MyMvcApplication.csproj).

    2. Find the top-most element and add a new element named :

    :

    ...

    true

    3. Scroll down to the end of the file and uncomment the element. Update itscontents to match the following:

    4. Save the file and reload the project in Visual Studio.

    Enabling view compilation may add some extra time to the build process. It is recommended that thisis not enabled during development as a lot of compilation is typically involved during the development

    process.

    Summary

    In this article, we mixed ASP.NET Webforms and ASP.NET MVC in one application and shared data between boththese technologies. We also added a post-build action to a project file to make sure that all views can be compiled.