2009-03-25 12 views
5

Actualmente estoy registrar cada control de usuario por separado en Web.configWeb.config ¿Es posible registrar todos los controles de usuario en el directorio especificado

<pages validateRequest="false"> 
    <controls> 
    <add tagPrefix="cc1" src="~/Controls/MyUserControl1.ascx" tagName="MyUserControl1"/> 
    ...  
    <add tagPrefix="cc1" src="~/Controls/MyUserControlN.ascx" tagName="MyUserControlN"/> 
    </controls> 
</pages> 

Pero de vez en cuando me olvido de checkin web.config . En realidad, generalmente olvido que ha cambiado omítalo porque a menudo rompe la configuración que otros configuran para conectarse a su copia de DB base local.

Me preguntaba ¿es posible que sólo tiene que especificar el directorio controla todo y obtener todos los controles no registrados automáticamente

Respuesta

8

Sí y no.

Básicamente, puede registrar todos sus controles de usuario en el archivo web.config. PERO te encontrarás con problemas si quieres usar cualquiera de tus controles de usuario dentro de otros controles de usuario.

Por lo tanto, si nunca va a anidar controles de usuario, está listo para funcionar. Pero si quieres la flexibilidad de controles de usuario nido tienes algunas opciones:

  1. a todos inscribirse en el web.config, y luego, en el caso de anidación, registrar el control que está directamente en la anidación el control de usuario principal.
  2. Como Bryan mencionó anteriormente, compila tus controles de usuario en un ensamblado y los referencia en el archivo web.config.
  3. Esta es la peor opción, pero básicamente puede evitar el problema de anidamiento al registrar todos sus controles de usuario en el archivo web.config colocando los controles en las subcarpetas ... no es una gran opción.
  4. Otra opción es escribir con fuerza sus controles de usuario, tal vez mediante la creación de clases base para sus controles de usuario.

Básicamente no es un error en el marco sino el resultado de compilar todo en un único conjunto. La aplicación esencialmente no puede distinguir entre controles de usuario.

Hay algo de información más here y here. check out the comments on this one

+0

Gracias, eso es genial. Probablemente iré creando un proyecto web y un proyecto separado Web.Controles la próxima vez que inicie un nuevo proyecto –

+0

genial, me interesará saber si funciona y qué tan fácil es implementarlo. ¡buena suerte! – andy

1

Eso no es posible en web.config, por lo que yo sé. Hay un par de soluciones: una pondría los controles en un proyecto separado y los compilaría en un único ensamblaje al que se hace referencia en web.config.

Personalmente, me gusta omitir el registro de web.config y simplemente registrarlos en la página que esté usando los controles. Eso evitaría el problema de romper la web.config de otros desarrolladores.

1

generar su Web.Config de Global.asax:

protected void Application_Start(object sender, EventArgs e) 
{ 

    Configuration config = WebConfigurationManager.OpenWebConfiguration("~/"); 
    PagesSection webSection = config.GetSection("system.web/pages") as PagesSection; 

    List<TagPrefixInfo> toRemove = new List<TagPrefixInfo>(); 
    foreach (TagPrefixInfo info in webSection.Controls) 
    { 
     if (info.TagPrefix != "asp") 
      toRemove.Add(info); 
    } 

    foreach (TagPrefixInfo list in toRemove) 
    { 
     webSection.Controls.Remove(list); 
    } 

    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/Controls")); 
    foreach (FileInfo file in di.GetFiles("*.ascx")) 
    { 
     TagPrefixInfo newtag = new TagPrefixInfo("PREFIX", null, null, file.Name.Replace(".ascx",""), string.Concat("~/Controls/", file.Name)); 
     webSection.Controls.Add(newtag); 

    } 

    config.Save(ConfigurationSaveMode.Modified); 
    ConfigurationManager.RefreshSection("system.web/pages"); 

} 

... y todas las entradas aparecerán en web.config.

0

Aquí hay una adaptación de VB.NET de la solución de @Jeff Fritz. Hace lo mismo pero incluye todos los controles ubicados en cualquier lugar de la solución. (Nuestra arquitectura utiliza los módulos que se pueden incorporar como externos SVN, por lo que esta es una forma muy agradable para asegurarse de que la aplicación host es consciente de los controles de todos los módulos.)

Sub RegisterUserControls() 
     Dim Config As Configuration = WebConfigurationManager.OpenWebConfiguration("~/") 
     Dim WebSection As PagesSection = TryCast(Config.GetSection("system.web/pages"), PagesSection) 
     Dim ToRemove As List(Of TagPrefixInfo) = (_ 
       From t As TagPrefixInfo In WebSection.Controls _ 
       Select t Where t.Source IsNot Nothing AndAlso t.Source.EndsWith(".ascx") _ 
      ).ToList 
     For Each t As TagPrefixInfo In ToRemove 
      WebSection.Controls.Remove(t) 
     Next 
     Dim SiteRoot As New DirectoryInfo(Server.MapPath("~")) 
     For Each f As FileInfo In SiteRoot.GetFiles("*.ascx", SearchOption.AllDirectories) 
      Dim Source As String = Path.Combine("~/", f.FullName.Replace(SiteRoot.FullName, "")).Replace("\", "/") 
      Dim TagName As String = Path.GetFileNameWithoutExtension(f.Name) 
      Dim NewTag As New TagPrefixInfo(_ 
       tagPrefix:="YOURPREFIX", _ 
       nameSpace:=Nothing, _ 
       assembly:=Nothing, _ 
       TagName:=TagName, _ 
       Source:=Source) 
      WebSection.Controls.Add(NewTag) 
     Next 
     Config.Save(ConfigurationSaveMode.Modified) 
     ConfigurationManager.RefreshSection("system.web/pages") 
    End Sub 

(Por supuesto que haría referencia a este en Application_Start como lo hizo Jeff.)

Cuestiones relacionadas