asp.net - tutorial - asp net sql




In Web.config ist es möglich, alle Benutzersteuerelemente im angegebenen Verzeichnis zu registrieren (3)

Momentan registriere ich jedes Benutzersteuerelement separat in Web.config

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

Aber von Zeit zu Zeit vergesse ich, in web.config einzuchecken. Eigentlich vergesse ich normalerweise, dass es geändert wurde, überspringe es, weil es häufig Einstellungen bricht, die andere einstellen, um sich mit ihrer lokalen DB DB Kopie zu verbinden.

Ich frage mich, ob es möglich ist, nur das gesamte Controls-Verzeichnis anzugeben und alle dort registrierten Steuerelemente automatisch zu registrieren


Das ist in der web.config nicht möglich, soweit ich weiß. Es gibt einige Problemumgehungen ... einer würde Ihre Steuerelemente in einem separaten Projekt speichern und sie zu einer einzelnen Assembly kompilieren, die in web.config referenziert wird.

Persönlich möchte ich die web.config Registrierung überspringen und sie einfach auf jeder Seite registrieren, die die Steuerelemente verwendet. Das würde das Problem vermeiden, die web.config eines anderen Entwicklers zu brechen.


Generieren Sie Ihre Web.Config von 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");

}

... und alle Ihre Einträge erscheinen in web.config.


Ja und nein.

Grundsätzlich können Sie alle Benutzersteuerungen in der Datei web.config registrieren. ABER Sie werden auf Probleme stoßen, wenn Sie Ihre Benutzersteuerelemente in anderen Benutzersteuerelementen verwenden möchten.

Also, wenn Sie Benutzersteuerelemente nie verschachteln, sind Sie gut zu gehen. ABER wenn Sie die Flexibilität haben wollen, User Controls zu verschachteln, haben Sie ein paar Möglichkeiten:

  1. Registrieren Sie sie alle in der Datei web.config, und registrieren Sie dann im Falle der Verschachtelung das verschachtelte Steuerelement direkt im übergeordneten Benutzersteuerelement.
  2. Wie oben erwähnt, kompilieren Sie Ihre Benutzersteuerelemente in eine Assembly und verweisen Sie sie in der Datei web.config.
  3. Dies ist die schlechteste Option, aber im Grunde können Sie das Verschachtelungsproblem umgehen, wenn Sie alle Benutzersteuerungen in der Datei web.config registrieren, indem Sie Ihre Steuerelemente in Unterordner platzieren ... keine gute Option.
  4. Eine weitere Möglichkeit besteht darin, Ihre Benutzersteuerelemente stark zu typisieren, indem Sie beispielsweise Basisklassen für Ihre Benutzersteuerelemente erstellen.

Im Grunde ist es kein Fehler im Framework, sondern ein Ergebnis des Kompilierens von allem in eine einzelne Assembly. Die App kann im Wesentlichen nicht zwischen Benutzersteuerelementen unterscheiden.

Es gibt noch mehr Infos hier und hier. Schaut euch die Kommentare dazu an





web-config