2010-12-16 3 views
3

injizieren Ich habe eine Aspx-Seite, die ich einen Verweis auf ein Benutzersteuerelement injiziert haben möchte. Das Benutzersteuerelement wird in einer separaten Assembly gespeichert und zur Laufzeit geladen. Nach dem Eingeben des Benutzersteuerelements sollte es dann in die Steuerelementauflistung der Seite geladen werden.ein Webbenutzer Steuerelement mit Ninject in WebForms

Alles scheint gut zu funktionieren, erwarte den Punkt des Hinzufügens des Steuerelements zu der Seite. Es gibt keinen Fehler, aber die Benutzeroberfläche für das Steuerelement wird nicht angezeigt.

global.asax.cs

protected override Ninject.IKernel CreateKernel() 
{ 
    var modules = new INinjectModule[] { new MyDefaultModule() }; 
    var kernel = new StandardKernel(modules); 

    // Loads the module from an assembly in the Bin 
    kernel.Load("ExternalAssembly.dll"); 
    return kernel; 
} 

und hier ist, wie das externe Modul in der anderen Baugruppe definiert:

public class ExternalModule : NinjectModule 
{ 
    public ExternalModule() { } 
    public override void Load() 
    { 
     Bind<IView>().To<controls_MyCustomUserControlView>(); 
    } 
} 

Der Debugger zeigt, dass, wenn die Anwendung ausgeführt wird, die Last auf Das externe Modul wird aufgerufen, und die Abhängigkeit wird in die Seite eingefügt.

public partial class admin_MainPage : PageBase 
{ 
    [Inject] 
    public IView Views { get; set; } 

An diesem Punkt, wenn versucht wird, die Ansicht (hier ein Benutzersteuerelement) der Seite hinzuzufügen, wird nichts angezeigt. Hat das etwas damit zu tun, wie die Benutzersteuerung von Ninject erstellt wird? Das geladene Steuerelement scheint eine leere Kontrollsammlung zu haben.

innen aspx Seite

var c = (UserControl)Views; 

// this won't show anything. even the Control collection of the loaded control (c.Controls) is empty 
var view = MultiView1.GetActiveView().Controls.Add(c); 

// but this works fine 
MultiView1.GetActiveView().Controls.Add(new Label() { Text = "Nice view you got here..." }); 

und schließlich die Ansicht/Benutzersteuerung:

public partial class controls_MyCustomUserControlView : UserControl, IView 
{ 
} 

Es enthält nur ein Etikett:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyCustomUserControlView.ascx.cs" Inherits="controls_MyCustomUserControlView" %> 

<asp:Label Text="Wow, what a view!" runat="server" /> 
+0

Bevor jemand MEF oder System.Addin vorschlägt, habe ich sie bereits ausprobiert. – yanta

Antwort

2

der Lage gewesen, diese Funktion zu erhalten durch den Aufruf Page.LoadControl mit dem Benutzersteuerelement als Ressource.

Page.LoadControl (typeof (controls_controls_MyCustomUserControlView), null) funktioniert nicht, jedoch funktioniert Page.LoadControl ("controls_MyCustomUserControlView.ascx").

Da die Steuerung in einem externen Baugruppe ist, erzeugen zuerst einen VirtualPathProvider und Virtual als http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx diskutiert

Die benutzerdefinierten VirtualPathProvider verwendet werden, zu überprüfen, ob die Benutzer der Kontrolle in einer externen Anordnung angeordnet ist und die Virtual (user Control) wird als Ressource von der Assembly zurückgegeben.

nächste Setup des Ninject Modul die Benutzersteuerung laden:

public override void Load() 
    { 
     //Bind<IView>().To<controls_MyCustomUserControlView>(); 
     Bind<IView>().ToMethod(LoadControl).InRequestScope(); 
    } 

    protected IView LoadControl(Ninject.Activation.IContext context) 
    { 
     var page = HttpContext.Current.Handler as System.Web.UI.Page; 
     if (page != null) 
     { 
      //var control = page.LoadControl(typeof(controls_MyCustomUserControlView), null); 
      var control = page.LoadControl("~/Plugins/ExternalAssembly.dll/MyCustomUserControlView.ascx"); 
      return (IView)control; 
     } 
     return null; 
    } 

„Plugins“ ist nur ein Präfix in dem VirtualPathProvider zur Bestimmung, ob die Steuerung in einer anderen Baugruppe befindet.

Wenn Ihr Benutzersteuerelement einen Namespace hat, stellen Sie sicher, dass Sie den Steuernamen in LoadControl als Präfix angeben. Die andere Sache ist die Verwendung von CodeBehind anstelle von CodeFile, da ASP.NET versucht, eine CodeBehind-Datei zu laden.

<%@ Control Language="C#" AutoEventWireup="true" 
CodeBehind="~/MyCustomUserControlView.ascx.cs" Inherits="controls_MyCustomUserControlView" %> 
Verwandte Themen