2010-02-04 19 views
39

¿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)?Combinar ASP.Net MVC con WebForms

¿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 el described here parecen algo obsoleta

Respuesta

5

Gran respuesta anterior. La otra cosa que podría considerar es migrar de ASP.NET a ASP.NET MVC, en cuyo caso this post might help you migran los archivos del proyecto.

16

Como referencia logré realizar esta tarea ayer; añadir la funcionalidad de 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 bueno, 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. Crear un nuevo ASP.NET MVC 4 Aplicación y selecciona la vacío del modelo (con la maquinilla de afeitar)

  2. Una vez cargado, hace clic derecho en Referencias> Navegue y luego navegue hasta 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, luego repliqué la estructura de carpetas de nivel superior del sitio existente (menos la carpeta Bin), dando como resultado que los 2 sitios tengan las mismas carpetas de nivel superior (pero el nuevo proyecto tenga MVC App_Start, Controladores, Modelos y también ve carpetas, pero no Bin obviamente).

  4. Una vez configurada, copié las subcarpetas y archivos de la carpeta de nivel superior correspondiente en Windows Explorer 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.Atención: en la carpeta raíz, lo hice NO copia en web.config o Global.asax, sino que se copia en todos los otros archivos (como default.aspx, etc)

  5. Una vez que todo el contenido era copiado, abrí web.config en el nuevo proyecto y web.config en el sitio existente. He copiado en la nueva web.config nada específico para el sitio web existente (appsettings, connectionStrings, espacios de nombres, información de miembros, etc.). Lo mismo se aplica a los archivos Global.asax.

  6. que intentaron una construcción fija y nada me había perdido.

  7. Una vez que todo estuvo bien (y había disparado algunas pantallas amarillas de muerte) noté que recibí el error de página no encontrada al cargar default.aspx. Esto se debe a enrutamiento, aquí es los cambios que hice a la información de enrutamiento (que se encuentra 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 todas estas medidas adoptadas , 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 sat y codificación :)

0

Estaba demasiado sorprendido en esta situación, después de todo, conseguí una solución que funcionó, antes que nada, copie web.config en su carpeta de vistas

Después de ese archivo abierto Route.config(Routeconfig), allí encontrará un método RegisterRoutes, que sea como es y crear otro método denominado RegisterRoutes2(), y copiar y pegar el código siguiente 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. A continuación, vaya a global.asax archivo, allí encontrará RegisterRoutes() ha sido llamado, simple ahora, también llamada RegisterRoutes2(). Y listo, reinicie su aplicación o limpie la compilación, se ejecutará.

Cuestiones relacionadas