Combine ASP.Net MVC con WebForms

¿Sería posible crear una aplicación raíz MVC (Portal con páginas maestras y temas) y agregar un par de subproyectos basados ​​en WebForms (ya tenemos una aplicación WebForms existente que nos gustaría integrar en el Portal)?

¿Cómo centralizaría la navegación (sitemaps, url routing)?
¿Cómo compartirías las páginas maestras?
¿Cómo se referiría a los recursos (~ problemas, etc.)?

Soluciones como la descrita aquí parecen algo anticuadas

La combinación de formularios web con MVC es completamente posible. Vea esta publicación del blog de Scott Hanselman para una introducción.

  • Compartir páginas maestras: vea esta pregunta de StackOverflow
  • Enrutamiento: en ASP.Net 4.0, el enrutamiento se ha habilitado para rutas de página de formularios web (blog de scottgu)

Como referencia logré realizar esta tarea ayer, agregar funcionalidades MVC a un sitio web existente de WebForms, es decir, así que pensé que escribiría en caso de que fuera útil para alguien.

La gente dice: “la mejor manera es reescribir su aplicación de formularios web como MVC”, pero a menudo no hay argumentos comerciales para esto cuando la aplicación está bien establecida y ha crecido con el tiempo para ser todo un monstruo (que todavía funciona bien, podría agregar ) En mi caso, nos habían pedido que implementaramos una nueva función en esta aplicación, y luego de haber estado desarrollando MVC en otros proyectos recientemente, quería construir esta nueva función en MVC. Esto es lo que hice:

  1. Cree una nueva aplicación ASP.NET MVC 4 y seleccione la Plantilla vacía (con Razor)

  2. Una vez cargado, haga clic derecho en References > Browse y luego navegue a la carpeta Bin de mi sitio web existente. Luego agregué el DLL que estaba usando en el sitio existente. Como referencia, estoy usando AjaxControlToolkit, así que decidí agregar el último de NuGet. Esto debería actualizar automáticamente el archivo web.config

  3. Luego abrí Windows Explorer y navegué hasta la carpeta raíz de mi sitio web existente. Al usar Visual Studio, repliqué la estructura de carpetas de nivel superior del sitio existente (menos la carpeta Bin), lo que resultó en que los 2 sitios tienen las mismas carpetas de nivel superior (pero el nuevo proyecto tiene MVC App_Start, Controladores, Modelos y Vistas carpetas también, pero no Bin obviamente).

  4. Una vez configurada, copié las subcarpetas y archivos de la carpeta correspondiente de nivel superior en el Explorador de Windows y los pegué en la solución. Si lo hace de la manera correcta, el proyecto le permite copiar en subcarpetas y contenido directamente, agregando elementos existentes a través de Visual Studio, solo copias en archivos, ahorrando tiempo. Tenga en cuenta: para la carpeta raíz, NO copié en web.config o Global.asax , pero copié en todos los demás archivos (como default.aspx, etc.)

  5. Una vez que se copió todo el contenido, abrí web.config en el nuevo proyecto y web.config en el sitio existente. Copié en la nueva web.config cualquier cosa específica para el sitio web existente (appSettings, connectionStrings, namespaces, información de membresía, etc.). Lo mismo se aplica a los archivos Global.asax.

  6. Intenté una comstackción y arreglé todo lo que me había perdido.

  7. Una vez que todo estuvo bien (y disparé algunas pantallas amarillas de la muerte) noté que recibí el error de página no encontrada al cargar default.aspx . Esto se debe al enrutamiento, aquí están los cambios que realicé en la información de enrutamiento (ubicada en Global.ascx MVC 3 o 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 } ); } 

Con todos estos pasos, el sitio se cargó y ejecutó como siempre, pero ahora tengo un ASP.NET WebForms y un híbrido MVC. Estoy seguro de que probablemente haya formas más sencillas de llevar a cabo esta tarea, pero probé con otros métodos y fallé. De esta manera me tomó alrededor de 20 minutos y estaba en funcionamiento … bien sentado y encoding 🙂

Gran respuesta arriba. La otra cosa que podría considerar es migrar de ASP.NET a ASP.NET MVC, en cuyo caso esta publicación podría ayudarlo a migrar los archivos del proyecto.

Estaba demasiado sorprendido en esta situación, después de todo obtuve una solución que funcionó, primero que nada, copiar web.config en su carpeta de vistas.

Después de abrir el Route.config(Routeconfig) , encontrará un método RegisterRoutes , guárdelo como está y cree otro método llamado RegisterRoutes2() , y copie y pegue el siguiente código de método de la aplicación mvc:

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

en algunos casos, el nombre del método en la aplicación mvc sería RegisterRoutes. Si el código anterior no funciona, copie y péguelo desde la aplicación mvc de su máquina. Luego, ve al archivo global.asax , encontrarás que RegisterRoutes() ha sido llamado, simple ahora, también llama a RegisterRoutes2() . Y listo, reinicie su aplicación o limpie la comstackción, se ejecutará.