我有一个aspx页面,希望向其中注入对用户控件的引用。用户控件存储在单独的程序集中,并在运行时加载。注入用户控件后,应将其加载到页面的控件集合中。
一切似乎都正常工作,除了将控件添加到页面的部分。没有错误,但是控件的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..." });
最后是视图/用户控制:
public partial class controls_MyCustomUserControlView : UserControl, IView
{
}
它只包含一个标签:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyCustomUserControlView.ascx.cs" Inherits="controls_MyCustomUserControlView" %>
<asp:Label Text="Wow, what a view!" runat="server" />