vista tutorial paso net mvc modelo form ejemplo controlador asp asp.net asp.net-mvc visual-studio web-site-project

tutorial - ¿Cómo rociar-en ASP.Net MVC en un proyecto de sitio web existente?



razor mvc (8)

Tengo un legado (jaja) ASP.Net Webforms Project Site Site en Visual Studio 2008 SP1, en el que me gustaría introducir gradualmente algunas funcionalidades de MVC.

La mayoría de la información que puedo encontrar sobre cómo integrar ASP.Net MVC con WebForms parece suponer el uso de un proyecto de aplicación web . Sin embargo, parece imposible encontrar información sobre cómo actualizar un proyecto existente de sitio web ASP.net con las características ASP.Net MVC.

Revisé la publicación de Scott Hanselman y el capítulo 13 de su próximo libro, ambos asumen el tipo de proyecto de aplicación web .

es posible? ¿Alguien tiene un tutorial sobre esto?


Siempre que configure el enrutamiento en web.config, configure la estructura de directorios necesaria y agregue las rutas correctas en global.asax, en teoría podría agregar elementos MVC a cualquier proyecto web. Hasta donde sé, esos son los únicos requisitos para que funcione.

Sin embargo, la combinación de los dos podría ser un poco confusa y difícil de mantener, a largo plazo. Tal vez podría mover todo el contenido del sitio de formularios web existentes en una subcarpeta para mantenerlo fuera del camino y mantener limpio el directorio raíz del sitio para reducir el desorden y aclarar las cosas.


Para un proyecto WebSite, solo necesita agregar Controladores a App_Code, no a la raíz. Echarás de menos algunas bondades de VS, ya que no sabe que estás utilizando MVC sin el archivo csproj, pero en realidad lo harás funcionar.

Simplemente recuerda heredar de Controller y ViewPage y deberías ser bueno.


Algo que aprendo, al tratar de migrar una aplicación MVC2 es que su proyecto necesita un Default.aspx. Me encargaron agregar algunas funciones de la GUI a un proyecto de servicios web existente y, por lo tanto, no había default.aspx. Me tomó un tiempo descubrir por qué mis rutas no estaban siendo configuradas.


Pensé que daría una respuesta actualizada utilizando Visual Studio 2010 SP1 / NuGet / la utilidad totalmente desatendida de Scott Hanselman.

  1. Instale MVC3 (w / nuget) http://www.asp.net/mvc/mvc3
  2. Vaya al menú "Herramientas" en Visual Studio y seleccione "Library Package Manager" / "Package Manager Console"
  3. Una vez que aparece la ventana de la consola, cambie el "Proyecto predeterminado" para que sea su proyecto de formularios web.
  4. Escriba "Install-Package AddMvc3ToWebForms" ( http://nuget.org/List/Packages/AddMvc3ToWebForms )

Esto agregará todos los archivos dlls necesarios, javascript, web.config, configuración de cambios, etc. al proyecto. Si todo fue exitoso, debería poder presionar F5, navegar hasta "inicio" en su sitio web, y ver un formulario de muestra rendido por mvc: "Bienvenido a ASP.NET MVC, actualizado con un paquete NuGet de una manera totalmente no respaldada por ¡Hanselman! ¡Sin garantía! ".


El examen de Microsoft .NET 4.0 sobre desarrollo web (70-519) tiene casi esta pregunta exacta en los materiales de preparación. La respuesta, según Microsoft entonces, es:

  1. Convierta el sitio web de formularios web en una aplicación web (es decir, proyecto de webapp).
  2. Agregue referencias a "los ensamblados de ASP.NET MVC 2" en el archivo de configuración de la aplicación web.

Esta información está en materiales pagados que mi empleador compró, por lo que no necesariamente hay una página web que indique claramente a qué vínculo puedo vincularme.


Si desea agregar MVC 3 a un sitio web asp.net en lugar de a un proyecto web, entonces el paquete nuget AddMvc3ToWebForms de Scott Hanselman le dará el 99% del camino hasta allí, pero arrojará un error durante la instalación. Puede ignorarlo (creo, al menos en mis pruebas, este parece ser el caso), y se necesitan algunos pasos simples después de la instalación.

Todos los detalles en http://delradiesdev.blogspot.com/2011/08/adding-mvc-3-to-aspnet-web-site.html

Mark (@delradie)


Bueno, para empezar, agregar MVC a un proyecto de formularios web es bastante simple, para obtener las características en VS 2008 para MVC toma un poco más de trabajo (aún es fácil). Primero, debe asegurarse de hacer referencia a los ensamblajes y utilizar .Net 3.5. En segundo lugar, puede crear una carpeta de controladores y una carpeta de vistas en su proyecto actual de formularios web. También puede crear un controlador simple con una acción de índice. Luego configure / configure las rutas en el archivo global.ascx. Deberías establecer desde allí. Marque aquí para referencia.

Sin embargo, solo podrá crear páginas aspx con código subyacente (puede eliminarlas e ingresar la clase de herencia correcta en el marcado). Para realmente "convertir" su tipo de proyecto para que pueda obtener la bondad de MVC y Visual Studio (agregar nueva vista, controlador de goto, etc.) va a tomar un poco de juego. Mi mejor consejo es crear un nuevo proyecto de MVC en VS 2008 y un nuevo proyecto de aplicación web y comparar los archivos .csproj en texto sin formato. Hay un largo valor de cadena que le dice a VS la plantilla del proyecto.

Créame, esto funciona. Lo he hecho antes en mis propios proyectos heredados. No recuerdo cómo encontré el tipo de proyecto "clave" además de la prueba / error / eliminación. ASP.Net MVC funciona bien en el mismo proyecto que los formularios web.

ACTUALIZACIÓN: creo que puede cambiar a un tipo de proyecto MVC, que sigue siendo una aplicación web al usar estos en el PropertyGroup del archivo .csproj. Compare esos con lo que tiene y cambie los que son diferentes, asegúrese de copiar / hacer una copia de seguridad del archivo.

<ProjectGuid>{B99EC98A-1F09-4245-B00D-5AF985190AA9}</ProjectGuid> <ProjectTypeGuids>{603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

Actualización 2: no afectaría su proyecto ni lo afectaría mucho. Si no es fácil, haga una copia de seguridad y juegue. Si encuentra cambios, siempre tendrá la copia de seguridad. Era escéptico al principio, pero me alegré de haber tomado el camino de MVC.


Tenía un sitio web ASP.NET bastante grande (no una aplicación web) y quería agregarle MVC3. No tuve la opción de cambiar el tipo de proyecto, así que tuve que ir al sitio web (asp.net 4.0).

Utilizo un proyecto MVC por separado, pero no como su propia aplicación web, sino como un conjunto dentro de mi antiguo sitio web.

Aquí hay un resumen de lo que hice:

  • Creé una nueva aplicación web MVC3 en Visual Studio 2010, utilicé la plantilla vacía y el motor Razor view.
  • Lo agregué a la solución con mi sitio web existente.
  • Cambié la ruta de salida para el ensamblaje del directorio bin local al directorio bin de mi sitio web.
  • Eliminé las carpetas ''Contenido'' y ''Guiones'' de la aplicación MVC. Tanto el contenido como los scripts ya forman parte de mi sitio web y también puedo hacer referencia a ellos desde las ''páginas'' de MVC.
  • Eliminé los archivos Global.asax. * Del proyecto. Estoy usando Global.asax en el sitio web.
  • Copié la carpeta ''Vistas'' y las subcarpetas al sitio web. Debido a que estos son archivos reales y no forman parte del ensamblaje, deben existir dentro del sitio web, no en el proyecto que crea el ensamblado MVC.
  • En este punto, podría haber eliminado la carpeta ''Vistas'' del proyecto MVC, pero es solo en este tipo de proyecto que recibo soporte de Visual Studio para agregar una nueva vista. Así que a veces creo una vista aquí y luego la paso al sitio web. Al editar los archivos cshtml en mi sitio web, todavía recibo Intellisense completo.
  • Se agregó enrutamiento al sitio web. Acabo de copiar un código de MVC global.asax en el archivo.asax global de mi sitio web. Necesitamos algunos usos:

    using System.Web.Mvc; using System.Web.Routing;

En Application_Start necesitamos:

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

A continuación, agregue los métodos de enrutamiento habituales:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // your routes }

A continuación, agregue algunas cosas al web.config de su sitio web. En system.web bajo compilación, necesitamos los siguientes ensamblajes:

<assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies>

Inicialmente también agregué un poco de espacio de nombres MVC a web.config, pero parece funcionar bien sin ellos.

Ahora crea nuevas rutas en Global.asax del sitio web, luego agrega un controlador correspondiente en el proyecto MVC y luego regresa al sitio web para agregar una vista. Entonces, la lógica está en un ensamblaje mientras que las vistas y el enrutamiento están definidos en el sitio web.

Todavía puede depurar en los controladores MVC estableciendo puntos de interrupción allí, pero debe depurar iniciando el sitio web.

Si usa la ruta sugerida por defecto de MVC:

routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } );

una llamada a www.misitio.com servirá el contenido del control / vista del hogar no su antigua página de inicio predeterminada.aspx, así que simplemente no uso dicha ruta. Si enruta el conflicto con archivos y carpetas físicas existentes, use restricciones con expresiones regulares en las rutas para excluir dichos conflictos.

Aunque utilizo páginas maestras en el sitio web, el html real para las partes comunes de la página se crea por código en otro ensamblaje. Podría llamar a los mismos métodos desde mi _ViewStart.cshtml o mi controlador base.

Hasta ahora no he visto ningún punto negativo real sobre este enfoque.