2009-10-28 15 views
5

Estoy convirtiendo un proyecto 1.1 en 2.0 y tengo un problema con algunos controles de usuario.UserControls in Class Library

En el proyecto original, había un proyecto de biblioteca de clase y el proyecto del sitio web. En el proyecto de biblioteca de clase, había una carpeta llamada UserControls y en ella se encontraban varios archivos ascx y su código detrás de los archivos.

Me gustaría mantener la misma estructura, así que introduzco estos controles de usuario en mi nueva solución en un proyecto de biblioteca de clases separado. Lo cambié de una clase completa a una clase parcial y cambié CodeBehind a CodeFile de la página.

En el viejo sistema de control de usuario, todos los controles web en el control de usuario se enumeran como sigue

protected System.Web.UI.WebControls.DropDownList _findModeList; 

etc.

pensé con él que es .net 2 y utilizando el atributo CodeFile lugar, Puede que no necesite hacer esto, pero no compila cuando lo omito.

Sin embargo, cuando lo incluyo, se compila, pero obtengo "Referencia de objeto no establecida en una instancia de un objeto". error al intentar usar _findModeList en el archivo de código.

¿Es posible poner controles de usuario en una biblioteca de clases en .net 2.0?

Respuesta

3

No realmente. El archivo .ASCX debe incluirse en cada proyecto de aplicación web que lo utilice. Para evitar duplicados, puede almacenar el UserControl en la carpeta de su Class Library y usar la función "Add As Link" de Visual Studio.

Seleccione "Agregar elemento existente" en el menú contextual de su aplicación web, seleccione el control de usuario y, en lugar de hacer clic en el botón "Agregar", haga clic en la flecha en ese botón y seleccione "Agregar como enlace".

1

¿Está trabajando con un proyecto de aplicación web? O un sitio web? Es confuso, lo sé ...

Si está trabajando con un WAP, use CodeFile y deje que ASP.NET genere los archivos .designer.cs por usted. No declare los objetos de su .acsx. Está declarando una DropDownList nueva/diferente cuando declara explícitamente _findModeList en el archivo .cs al que hace referencia CodeFile. Es por eso que obtienes la referencia nula ... no se ha inicializado. Si no tiene un archivo .designer, haga clic derecho en .ascx en el Explorador de soluciones y haga clic en "Convertir a aplicación web".

Si está trabajando con un Sitio en lugar de un WAP, use el atributo CodeBehind. Continuará funcionando como en ASP.NET 1.1 y compilará sobre la marcha.

Para obtener un control para vivir completamente en una DLL ... use "controles personalizados" en lugar de controles de usuario. De nuevo, confuso.

1

En realidad, usted puede intentar crear una nueva aplicación Web Proyecto no Crear nuevo Sitio Web , porque entre estos dos son proyectos diferentes.

Después de crear la aplicación web, simplemente cree su Control de usuario (.ascx). Después de eso, puede intentar reconstruir su aplicación web. Una vez finalizado puede navegar a su directorio bin, debe haber dll para su aplicación web. Ahora puede usar este dll en otro proyecto de sitio web/aplicación web. Solo agrega referencia a este dll.

1

¿Ha intentado cambiar/agregar el atributo Inherits en la etiqueta <% @ Control%>?

<%@ Control Language="C#" CodeBehind="<PathToTheFile>" Inherits="namespace.and.classname" %> 
Cuestiones relacionadas