2011-03-24 25 views
11

Tenemos una solución con múltiples proyectos web, y hay algunas páginas que deberían estar presentes en varios de ellos. Por lo tanto, necesitaríamos algún tipo de proyecto compartido que contenga archivos aspx y a los que otros proyectos web puedan hacer referencia.Compartir página aspx entre proyectos

Ahora hay algunas implementaciones por ahí:

Una aplicación described by ScottGu que consiste en la construcción del proyecto común, y que la copia de la salida de aspx en el proyecto de acogida, y haciendo referencia a la DLL de la aspx. Este método tiene la desventaja de que si se modifica el apsx, debe volver a copiarse.

Otra opción, basada en David Ebbo's post sería convertir el aspx en ascx-es que se puede hacer referencia como controles personalizados, y que incluir esos custom-control-aspx-es en el proyecto host dentro de algunas páginas de marcador de posición. Pero mis preocupaciones son: ¿pueden todas las páginas de apsx transformarse en un ascx? Quiero decir que no hay ningún evento Page.LoadComplete en los controles de usuario, por ejemplo.

Y, sin embargo, otra opción es utilizar directorios virtuales que se asignen al proyecto web compartido, como se describe en Microsoft KB article. El problema nuevamente con este método es que las aspx-es compartidas deben estar en directorios predefinidos (es decir, el directorio virtual). Si el nombre del directorio virtual se superpone a un directorio físico, el virtual lo anula y no se pueden usar páginas de este último. ¿Es posible fusionar estos dos?

¿Alguna idea? Gracias de antemano P.S. ¿Qué hay de la depuración de las páginas compartidas?

Respuesta

4

He resuelto este problema haciendo biblioteca de clases compartida que contiene Ascx controles. No he encontrado dificultades reales al convertir páginas .aspx a controles .ascx. Encontré esta muestra de ScottGu realmente simple y un buen lugar para comenzar. http://webproject.scottgu.com/CSharp/usercontrols/usercontrols.aspx.

+0

Y con UserControls no hay necesidad de copiarlos (ver la propuesta de segundo párrafo de la pregunta). Gracias por la respuesta. – jaraics

+0

Ahora solo estoy copiando estos dll en el evento PreBuild, que no es un gran problema. Debería echar un vistazo a la publicación de David Ebbo. Gracias por el consejo. – azhons

0

¿Ha pensado en clasificar la funcionalidad en clases que heredan de la página y colocar esas clases en la DLL compartida. Todas las aplicaciones de implementación podrían implementar esa página heredando de ella y aún así poder cambiar la funcionalidad asumiendo que las clases base proporcionan métodos invalidables. He tenido bastante éxito con esto cuando tenía muchas páginas que se usaban en muchas aplicaciones y todas tenían el mismo código. Solo una posibilidad.

+1

Buen punto, pero tengo algo de contenido sobre los aspx-es (controles y contenido estático). ¿Hay alguna manera fácil de compilar ese contenido en el dll? Intenté compilar la página completa (marcado + código) en el dll (precompilando) e ininterrumpidamente desde esa clase, pero hay un error de tiempo de ejecución, "Se produjo un error al intentar cargar los recursos de cadena", lo que me hace piense que la página intenta cargar el marcado del dll como un recurso. – jaraics

+0

Debería ser capaz de compilar el contenido en el archivo dll estableciendo la propiedad de compilación de todos los controles en el recurso incrustado.Puede que tenga que cargar los controles del código consultando los recursos de la Asamblea, pero debería funcionar. – Josh

0

¿Ha considerado el desarrollo orientado al servicio? Cree la funcionalidad en servicios que puede compartir. Crea tu funcionalidad como widgets. De esta forma, solo tienes una base de código, pero puedes usarla en varios sitios.

pensar fuera de la (cuadro .Net)

1

La solución que estamos utilizando es ScottGu's method, lo que implica copiar los archivos aspx desde el proyecto compartido para los proyectos de acogida.

un evento posterior acumulación en las copias de proyectos compartidos los archivos en su lugar, como este

xcopy "$(ProjectDir)Forms\Techs\AddEditTech.aspx" "$(SolutionDir)..\TTAdmin\Forms\Companies" /i /d /y 
if errorlevel 1 goto BuildEventFailed 

xcopy .... 

goto BuildEventOK 

:BuildEventFailed 
echo POSTBUILDSTEP for $(ProjectName) FAILED 
exit 1 

:BuildEventOK 
echo POSTBUILDSTEP for $(ProjectName) COMPLETED OK 
Cuestiones relacionadas