2012-04-07 6 views
2

Ist es möglich, ein Benutzersteuerelement zu laden, das in der Datei web.config und nicht in der aspx-Datei registriert wurde?Programmgesteuertes Laden des Benutzersteuerelements in Code-Behind, das in web.config registriert ist

Hier ist ein Beispiel, was ich tun würde. In meiner aspx:

index.aspx

<%@ Register TagPrefix="module" TagName="ModExample" Src="~/controls/example.ascx" %> 

index.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    controls_example exmp = LoadContent("controls/example.ascx") as controls_example; 
    myContentPanel.Controls.Add(exmp); 
} 

Ich hatte meine Benutzersteuerung in der Seite zu registrieren, oder ASP würde nicht wissen, was "controls_example" war. Aber ich weiß, Sie Ihre web.config wie folgt aussehen ändern können:

<configuration> 
    <system.web> 
     <pages> 
      <controls> 
       <add tagPrefix="module" tagName="ModExample" src="~/controls/contentModule.ascx"/> 
       <add assembly="Subtext.Web.Controls" namespace="Subtext.Web.Controls" tagPrefix="module"/> 
      </controls> 
     </pages> 
    </system.web> 
</configuration> 

So, hier ist das Problem. Wie erstelle ich eine Variable vom Typ "controls_example", wenn sie in der Datei web.config registriert wurde?

Muss ich:

  • ein "using namespace" hinzufügen?
  • ändern/hinzufügen etwas in meiner web.config?
  • nicht definieren, was der Datentyp der Variablen ist? (Ich würde gerne das vermeiden)
  • etwas anderes?
+0

[hier] (http://stackoverflow.com/questions/8953690/programmatically-load-usercontrol-with-reference-in-web-config) ist ein Link zu was ich tun möchte, aber es war ungelöst . – gunr2171

Antwort

5

Ihre web.config sieht gut aus. Auf der Seite müssen Sie eine using mit dem Namespace Ihres Steuerelements hinzufügen. Dann können Sie die Methode LoadControl der Seite verwenden, um eine Instanz Ihres Steuerelements abzurufen, die Sie dann als untergeordnetes Steuerelement zu einem Container hinzufügen können (normalerweise wähle ich asp:Placeholder, um sicherzustellen, dass die Position dort ist, wo ich es haben möchte)

+0

Nur so, ich bin hier klar, mit dem obigen Beispiel, was wäre der Namespace würde ich hinzufügen? – gunr2171

+1

Der Namespace, in dem sich Ihre Steuerelementklasse aus 'example.ascx.cs' befindet. – CyberDude

+0

Und nein, Sie müssen nicht unbedingt den genauen Typ des Steuerelements kennen, wenn Sie keine anderen spezifischen Arbeiten daran ausführen. Sie können einfach 'System.Web.UI.Control' verwenden. – CyberDude

1

@Adrian, Hier ist meine Antwort auf Ihre Frage. Ich muss es hier sagen, denn ich werde weit über mein Char-Limit laufen.

Ok, das erste Problem, das ich hatte, war, dass ich eine ASP.NET Webseite wurde mit, keine ASP.NET Anwendung. Ich habe das geändert, also benutzte ich das letztere. Dies machte es so, dass alle Seiten, die von da an erstellt wurden, standardmäßig einen Namespace hatten (der Name des Ordners, in dem sie sich befanden). Ich weiß nicht, ob Sie Steuerelemente mit einem Namespace auf einer Website registrieren können, vielleicht weil Websites standardmäßig keine Namespaces haben.

Nehmen wir an, ich habe ein Web User Control namens myControl.ascx erstellt und als ~/controls/myControl.ascx gespeichert. Mit Blick auf die Ascx-Datei sollte die oberste Zeile lauten: <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="myControl.ascx.cs" Inherits="myApplication.controls.myControl" %>. myApplication ist der Name Ihrer Website, und Sie können ihn in den Namespace controls einfügen, da dies der Ordner ist, in dem er sich befindet. Wenn Sie sich den Code dahinter ansehen, stimmt der Namespace überein.

Jetzt haben Sie zwei Möglichkeiten, wie Sie das Steuerelement registrieren und verwenden können. Der langsame Weg besteht darin, jedes Steuerelement, das Sie verwenden möchten, auf jeder Seite, die Sie haben, zu registrieren, was gut ist, wenn Sie nur ein paar davon haben.Dazu schreiben Sie die folgende Zeile in der Seite, die Sie von der Steuerung aufgerufen werden sollen (wie die Indexseite, zum Beispiel):

<%@ Register TagPrefix="myC" TagName="myCoolControl" Src="~/control/myControl.ascx" %> 

, dass die langsame Art und Weise ist, aber es funktioniert (es sei denn, ich etwas getippt falsch).

Hier ist, was ich versucht habe: machen Sie es so, dass ich nicht tausendmal tippen muss, und tun Sie es nur einmal in der Datei web.config.

Konfigurieren Sie Ihre web.config Datei wie folgt aussehen:

<configuration> 
    <system.web> 
     <pages> 
      <controls> 
       <add tagPrefix="myCont" namespace="myApplication.controls" assembly="myApplication" /> 
      </controls> 
     </pages> 
    </system.web> 
</configuration> 

Dies wird automatisch jede Steuerregister in den „myApplication.controls“ Namespace gemacht, die, wenn Sie die Dinge richtig eingestellt ist, jede Kontrolle ist gemacht in der Ordner "Kontrollen". Denken Sie daran, dass Sie den Ordner "controls" nicht aufrufen müssen, damit dies funktioniert. Sie können einen beliebigen Namespace hier aufgelistet haben, und es sollte gut funktionieren.

Jetzt öffnen Sie eine Seite, die Sie ein Steuerelement von Programmatic (wie Index) laden möchten. Sie sind NICHT gehen Sie etwas in der aspx-Datei schreiben, einschließlich alles über die Registrierung der Seite. Die Steuerung ist bereits registriert, so alles, was wir tun müssen, ist es laden in dem Code-Behind:

myControl myCont = LoadControl("~/controls/myControl.ascx") as myControl; 
//feel free to use the variable, or add it to the page with a panel or something 

Ich hoffe wirklich, dass dies Ihre Frage beantwortet. Es hat etwas an meinem Ende gegraben, um es zum Laufen zu bringen, also bin ich froh, anderen mit diesem Problem zu helfen. Danke nochmal an CyberDude, der mich in die richtige Richtung gebracht hat.

Verwandte Themen