Cómo convertir un sitio web ASP.NET a una aplicación web ASP.NET

90

Tengo un sitio web ASP.NET 3.5 (jerga de estudio visual), pero el sitio sigue creciendo y parece bastante vaquero, entre otras cosas. Me gustaría ver que esto se convierta en una aplicación web (espacios de nombres y todo).

¿Es esto algo que se puede hacer fácilmente en Visual Studio? Si no es así, ¿existen otras herramientas que puedan crear automáticamente todos los espacios de nombres, etc.?

RSolberg
fuente
4
Esa plantilla de sitio web es un POS realmente terrible en comparación con la plantilla de aplicación web. No veo ningún beneficio de usar la plantilla del sitio web ...
James
9
@James: solo una de las muchas razones por las que estoy buscando alejarme de eso ... Estás predicando al coro ...
RSolberg
2
Estoy seguro de que el siguiente tutorial es muy completo (no lo leí todo), pero una persona en youtube mostró una forma muy sencilla de convertir un sitio web en una aplicación web aquí: youtube.com/watch?v=oXptokM0v7w - as de costumbre, no puedo garantizar que esto funcione para todos. Creo que este método funcionará para personas con sitios más pequeños y menos complicados.
dyslexicanaboko
3
Si está utilizando VS2013, no olvide que el elemento del menú se ha movido .
Jon

Respuestas:

108

Bueno, resulta que la opción "Convertir a aplicación web" NO existe para "sitios web". La opción "Convertir a aplicación web" solo existe para "aplicaciones web".

[énfasis mío]

Entonces, aquí está el trato, para hacer la conversión, necesita:

  • Agregue una nueva "Aplicación web" a su solución VS 2008 (Archivo-> Agregar-> Nuevo proyecto-> C # -> Web-> Aplicación web ASP.NET).

  • Luego, copia todos los archivos del "sitio web" antiguo en la "aplicación web" recién creada y anula los archivos creados en él de forma predeterminada.

  • El siguiente paso es el más feo, debe agregar "manualmente" las referencias en su "sitio web" a la nueva "aplicación web". Pensé que el juguete VS 2008 PowerCommands haría esto por mí, ya que copia referencias de otros tipos de proyectos, pero no fue así. Debe hacerlo usted mismo, manualmente, y debe tener cuidado en este paso si tiene varias versiones del mismo ensamblaje (como AJAXToolkit en mi caso) o ensamblajes que tienen versiones tanto GAC como locales o algo así.

  • Siga repitiendo el último paso e intente construir la "aplicación web". Seguirá recibiendo errores como "'....' es un espacio de nombres desconocido. ¿Le falta una referencia de ensamblado?". Asegúrese de no tener ninguno de esos, excepto aquellos en los que '....' se reemplaza por los ID de los controles de servidor que usa. En otras palabras, siga agregando referencias y construyendo el proyecto hasta que solo aparezcan los errores que existen debido a que faltan archivos .DESIGNER.CS o .DESIGNER.VB.

  • Luego, vaya al nodo del proyecto raíz "aplicación web" en el explorador de soluciones VS 2008, y haga clic con el botón derecho en él, luego encontrará la opción "Convertir a aplicación web". Lo que hace esta opción es en realidad realizar pequeños cambios en las directivas "@Page" y "@Control" de las páginas y controles, y crear los archivos .DESIGNER.CS o .DESIGNER.VB necesarios.

  • Intente compilar la "aplicación web" nuevamente. Si obtiene errores, vea qué referencias pueden faltar y / o haga clic en "Convertir a aplicación web" nuevamente. A veces, si hay algún error que no sea el causado por la falta de archivos DESIGNER, no todas las páginas / controles tendrán esos archivos DESIGNER creados para ellos. Arreglar el problema de no DISEÑADOR y hacer clic en "Convertir a aplicación web" de nuevo debería hacer el trabajo para esto.

  • Una vez que haya terminado con la compilación VS exitosa, debería estar listo para comenzar. Empiece a probar su aplicación web. Opcionalmente, puede hacer clic derecho en el nodo del proyecto raíz "aplicación web" en VS 2008 Solution Explorer y hacer clic en "Propiedades", luego ir a la pestaña "Web" para configurar la "aplicación web" en una carpeta virtual en IIS (puede crear una nueva directorio virtual desde allí en VS). Si desea utilizar el directorio virtual de IIS que utilizaba el antiguo "sitio web", primero debe eliminarlo de IIS.

  • Actualización: cuando pruebe sus páginas, preste MÁS ATENCIÓN a las clases en la carpeta "App_Code", especialmente aquellas sin NAMESPACE. Pueden ser una gran trampa. Tuvimos un problema con dos sobrecargas de métodos de extensión en la misma clase estática que no tenía espacio de nombres, ¿una extiende DateTime? (Nullable) y llama a otra sobrecarga que amplía DateTime. Llamar a la otra sobrecarga como método de extensión pasó la compilación VS 2008 y nos dio un error de compilación SOLO EN TIEMPO DE EJECUCIÓN (con IIS). Cambiar la llamada a la otra sobrecarga de llamarlo como método de extensión a llamarlo como método estático normal (solo cambiando la llamada en la misma clase, las llamadas de otras clases permanecieron llamadas de método de extensión) resolvió este, pero claramente, no es tan seguro como solía ser en VS 2005.

  • Actualización 2: durante la conversión, VS 2008 cambia el nombre de su "App_Code" a "Old_App_Code". Este nuevo nombre suena feo, pero NO LE VUELVA A NOMBRARLO. En el modelo de "aplicación web", todo el código estará en un ensamblado. En tiempo de ejecución, el servidor web no sabe qué tipo de proyecto web está utilizando. Toma todo el código en la carpeta "App_Code" y crea un nuevo ensamblado para él. De esta manera, si tiene código en la carpeta llamada "App_Code", terminará con errores de compilación RUNTIME de que existen los mismos tipos en dos ensamblajes, el creado por VS y el creado por IIS / ASP.NET Development Server . Para evitar eso. deje el "Old_App_Code" con el mismo nombre, o cámbiele el nombre a CUALQUIER COSA EXCEPTO: "App_Code". No coloque ningún código en dicho "App_Code"

Sé esto desde antes, pero lo olvidé ahora porque no he usado el modelo de "sitio web" durante mucho tiempo :(.

Andrew Hare
fuente
2
Su enlace está roto en la parte superior, Error 500
Sameer Alibhai
6
Además, busque archivos de código para copiarlos como "contenido" y no como "compilar"
jcolebrand
14
Para aquellos de ustedes que hagan esto en VS2013, "Covert to Web App" se ha movido al menú Proyecto, en la parte inferior.
Eric Sassaman
3
@EricSassaman Pero para mí no está ahí para proyectos de sitios web.
NickG
1
@NickG, tiene razón, según la primera línea de la respuesta, NO está disponible para proyectos de sitios web, el menú Proyecto ni siquiera existe a menos que seleccione una Aplicación web en el Explorador de soluciones. Si ve "Sitio web" en el menú, no es una aplicación web. Siga los pasos anteriores para crear una aplicación web en blanco, copie sus archivos en ella. Luego, "Convertir a aplicación web" debería estar en el menú del proyecto para su nueva aplicación web. ¿Hiciste eso?
Eric Sassaman
5

Si tiene problemas para construir su nuevo proyecto de aplicación web, verifique las Propiedades del archivo en Visual Studio de todas las clases 'auxiliares'. Para un proyecto que estaba convirtiendo, la Acción de compilación se estableció en Contenido, mientras que debería haber sido Compilar.

Matt Burrell
fuente
3

Cree una nueva aplicación web en VS 2010.
1. Con el Explorador de Windows, copie todos sus archivos en la carpeta del proyecto.
2. En el explorador de soluciones VS 2010, muestre todos los archivos.
3. Seleccione los archivos y carpetas - haga clic con el botón derecho en incluir en el proyecto.
4. Haga clic con el botón derecho en el explorador de soluciones del proyecto y seleccione Convertir a aplicación web.

Hay bastantes pequeñas diferencias, como que la carpeta App_Code cambiará de nombre a old_app_code, lo que sorprendentemente no causa ningún error. El TypeName en sus fuentes de datos de objeto y las herencias en la etiqueta @Page pueden necesitar el [ProjectName]. prefijo agregado globalmente. Por ejemplo, si el nombre de su tipo era "BusinessLogic.OrderManager" y el nombre de su proyecto es InventorySystem, deberá cambiarlo a InventorySystem.BusinessLogic.OrderManager. Además, algunos cambios de visualización, como los validadores de campo obligatorios, ya no están predeterminados en fuente roja, sino en negro.

Tim Samandari
fuente
el archivo de código de mi aplicación no cambió como se suponía. Tuve que renombrarlo manualmente y luego cambiar todas las páginas de cs para compilar.
Mike
3

Al principio me enfrentaba a los mismos problemas. Después de seguir el libro Wrox Professional ASP.NET 4.0, encontré la siguiente solución para mi caso.

Primero creé una nueva aplicación web. Copie todos los archivos del sitio web en la carpeta de la aplicación web. Haga clic con el botón derecho en la aplicación y haga clic en convertir a la aplicación web.

Puede preguntar por qué necesita convertir una aplicación web en una aplicación web. La respuesta es que cuando crea un sitio web, simplemente codifica el archivo .cs donde sea necesario. Sin embargo, una aplicación web declara automáticamente .design.cs (o .vb) y un archivo .cs para la sección de código y diseño.

SIGUIENTE: Elimine todas las referencias manuales, como el atributo 'Inherits' en la directiva PAGE, a otros archivos en su sitio web, ya que los espacios de nombres se encargarán de hacer referencia a las clases de forma centralizada.

También enfrenté un problema, ya que no había incluido la carpeta OBJ y BIN en mi proyecto. Si cree que le faltan las carpetas BIN y OBJ, simplemente haga clic en el icono 'Mostrar todos los archivos' en el Explorador de soluciones y luego haga clic con el botón derecho en las carpetas que faltan y agregue al proyecto. (para asegurarse de que se compilen con el proyecto).

ACTUALIZACIÓN: Como @deadlychambers señala en los comentarios: Puede buscar en todas partes haciendo "Ctrl + Shift + F" y luego buscar Inherits="(.*?)". ¡Esto encontrará todas las ocurrencias y probablemente le ahorrará algo de tiempo!

Sunny R Gupta
fuente
1
Puede eliminar todo con Ctrl-shift-F y luego cambiar las opciones de búsqueda para la expresión regular y usar este Inherits = "(. *)?"
DeadlyChambers
1
Compruebe que es Inherits = "(. *?)" El otro tomará todo lo que hereda hasta la última comilla.
DeadlyChambers
1
Me acabo de encontrar con un problema en el que NO tener herencias hizo que el diseñador eliminara el espacio de nombres y luego eliminara la clase. Ojalá esto fuera más fácil.
DeadlyChambers
3

Ahora he migrado con éxito un proyecto de sitio web a una aplicación web y hay algunas trampas que hay que tener en cuenta.

Tener ReSharper a su disposición ayuda mucho a refactorizar los archivos aspx.

  1. Configure su solución y cree una aplicación web vacía
  2. Copiar todo el archivo
  3. Los archivos aspx en proyectos de sitios web no tienen un espacio de nombres. Envuelva sus clases en los espacios de nombres apropiados
  4. Durante la copia, todas mis páginas en subcarpetas se renombraron al nombre de mi proyecto y al nombre de la carpeta, por lo que obtuve 40ish public partial class FolderName_Projectname : PageSi es necesario, cambie el nombre de todos los archivos usando Resharper o manualmente. Si encuentra varios errores como "There is already a member Page_Load() defined", esto probablemente se deba a nombres de clase incorrectos y duplicación
  5. Después de agregar un espacio de nombres
  6. Reemplace CodeFiletodas las páginas aspx con Codebehindy especialmente preste atención a los archivos en su subcarpeta. Asegúrese de que Inhertis=""no contenga la ruta relativa. Tus espacios de nombres se encargan de todo. Entonces el formato correcto es Inherits="Namespace.classname". Si su clase tiene un espacio de nombres NaSpa y un nombre de archivo foo.cs, seríaInherits="NaSpa.foo"

  7. Una vez que haya preparado todos sus archivos (no olvide sus páginas maestras), ejecute "Convertir a aplicación web". Si encuentra errores después, enjuague y repita. Si encuentra errores del tipo "TextBoxName no se puede encontrar ¿le falta una referencia", asegúrese de que no se olvidó de desinfectar sus páginas aspx. Un buen indicador es comprobar los archivos del diseñador generados automáticamente. Si TextBoxNameno aparece allí, la conversión no se realizó correctamente.

  8. Resuelva las dependencias que falten.
  9. Construir
Marco
fuente
0

el espacio de nombres ASP predeterminado ya no parece funcionar. Así que parece que no puedo llamar a mis páginas User Controls.ascx desde fuera de la página. Darles un espacio de nombres y cambiar el valor predeterminado de ASP a mi espacio de nombres parecía funcionar.

Miguel
fuente