2010-12-16 9 views
3

ユーザーコントロールへの参照を挿入したいaspxページがあります。ユーザーコントロールは、別個のアセンブリに格納され、実行時にロードされます。ユーザーコントロールを挿入した後、コントロールはページのコントロールコレクションに読み込まれます。WebFormsにNinjectを使用してWebユーザーコントロールを挿入する

すべてが正常に動作しているようですが、ページにコントロールを追加する点が必要です。エラーはありませんが、コントロールのUIは表示されません。

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; 
} 

、ここで外部モジュールが他のアセンブリで定義されている方法です。

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

デバッガがオンロード、アプリが実行されたときにすることを示しています外部モジュールが呼び出され、依存関係がページに挿入されます。

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

この時点で、ページにビュー(ここではユーザーコントロール)を追加しようとすると、何も表示されません。これはNinjectによってユーザーコントロールが作成される方法と関係しますか?ロードされたコントロールに空のコントロールコレクションがあるようです。 aspxページ内の

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..." }); 

、最後にビュー/ユーザーコントロール:を呼び出すことで、この作業を取得することができた

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

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

誰かがMEFまたはSystem.Addinを提案する前に、私は既に試してみました。 – yanta

答えて

2

:それはちょうど1つのラベルが含まれ

public partial class controls_MyCustomUserControlView : UserControl, IView 
{ 
} 

Page.LoadControlをユーザーコントロールをリソースとして使用します。

Page.LoadControl( "controls_MyCustomUserControlView.ascx")ではPage.LoadControl(typeof(controls_controls_MyCustomUserControlView)、null)は機能しません。

制御は、外部のアセンブリであり、最初に説明http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx

VirtualPathProviderは、ユーザーコントロールが外部アセンブリ内に配置されているかどうかを確認するために使用されるカスタム、およびVirtualFile(ユーザとしてVirtualPathProviderとVirtualFileを作成するようにコントロール)がアセンブリとしてリソースとして返されます。

ユーザーコントロールをロードする次のセットアップNinjectモジュール:

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; 
    } 

「プラグイン」は、制御は別のアセンブリ内に配置されている場合VirtualPathProviderに決定するためだけのプレフィックスです。

ユーザーコントロールに名前空間がある場合は、コントロール名の先頭にLoadControlが付いていることを確認してください。もう一つは、ASP.NETがCodeBehindファイルをロードしようとするため、CodeFileの代わりにCodeBehindを使用することです。

関連する問題