Asp.net Web Forms y Asp.net MVC trabajando juntos

jueves, 19 de septiembre de 2013



En este post vamos a ver los pasos que tenemos que dar para añadir paginas Asp.net MVC a un proyecto Asp.net Web Forms, lo cual puede ser muy útil para migrar un proyecto poco a poco.

Lo primero que vamos a hacer es crear un proyecto web forms.


Paso 1 - añadimos la referencias necesarias para MVC que son
  • System.Web.MVC , aqui se encuentra el motor de MVC
  • System.Web.Routing, aquí se encuentra el motor que permite enlazar paginas según una ruta virtual y no ruta física de la página.
  • System.Web.Razor y System.WebPages.Razor para poder añadir páginas con motor Razor.
Paso 2 - añadimos las carpetas Controllers y Views al proyecto porque Asp.net mvc por convención va a buscar en esta carpetas, este comportamiento puede ser modificado, es así por defecto.

Paso 3 - configuramos el sistema de  routing por defecto para las paginas MVC, aquí se pueden definir routing para las paginas Web Forms también o dejar que se invoquen directamente con la ruta física.
Para crearlo los más parecido a un proyecto asp.net MVC modificamos la clase RouteConfig, añadiéndole using para System.Web.MVC para poder hacer routing MVC y dejando la clase así:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
           routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
Con esto le estamos indicando que las rutas de MVC son nombre del controlador / nombre de la Action / Id y además que si solo se indica el host, el controlador por defecto es Home y la acción por defecto que es Index.
También le indicamos al routing de mvc que ignore las rutas de ficheros aspx.

En este fichero routing pueden convivir routing de paginas web forms y de paginas mvc. Para web forms usaremos MapPageRoute especificando la ruta física del fichero y para MVC usaremos MapRoute y usará la convención por defecto para buscar los ficheros en las carpetas Controllers y Views.

Paso 4 - Para seguir la misma estructura que un proyecto MVC , ahora creamos dentro de la carpeta App_Start una clase FilterConfig.

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }

De esta forma añadimos el filtro de manejo de errores por defecto de MVC, donde podemos indicar entre otras cosas la pagina que se muestra cuando se produce un error.

Paso 5 - Añadimos en el Application_Start del fichero Global.asax las llamadas a los config que hemos creado

     AreaRegistration.RegisterAllAreas()
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
     RouteConfig.RegisterRoutes(RouteTable.Routes);

Paso 6 - Modificar web config añadiendo configuraciones necesarias para mvc


Añadir esta sección AppSettings
   
  
    
    
    
    
    
  
Modificamos la seccion compilation dentro de system.web
   
    
      
        
        
        
        
        
      
    

Y dentro de la seccion System.Web añadimos la seccion pages
   
    
      
        
        
        
        
        
        
      
    

Y añadimos las redirecciones para System.Web.Helpers, System.Web.Mvc, System.Web.WebPages a la versión referenciada por el proyecto para que los asemblies compilados a versiones anteriores funcionen con la versión más reciente.
   
      
        
        
      
      
        
        
      
      
        
        

Por último dentro de la carpeta views, tenemos que añadir este web.config, que es el que se añade por defecto en un proyecto Asp.net MVc dentro de esta carpeta
   



  
    
      

Paso 7 - Para que se comporte como un tipo de proyecto MVC y aparezcan acciones de añadir controlador etc.. tenemos que modificar el fichero del proyecto con un editor de texto como notepad por ejemplo y sustituir esta linea.

<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

por esta otra

<ProjectTypeGuids>{E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

Añadiendo en guid {E3E379DF-F4C6-4180-9B81-6769533ABE47} antes, ya se va a comportar como un proyecto Asp.net MVC. Este guid depende de la versión de MVC, en este caso es la 4.

Ahora ya podemos añadir un controlador y su vista correspondiente tanto con motor aspx como con motor razor y ya debería funcionar.