gpt4 book ai didi

asp.net - 在 WebForms 中使用 Ninject 注入(inject) Web 用户控件

转载 作者:行者123 更新时间:2023-12-02 15:07:52 26 4
gpt4 key购买 nike

我有一个 aspx 页面,我想在其中注入(inject)对用户控件的引用。用户控件存储在单独的程序集中并在运行时加载。注入(inject)用户控件后,应将其加载到页面的控件集合中。

除了将控件添加到页面之外,一切似乎都工作正常。没有错误,但不显示控件的 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>();
}
}

调试器显示,当应用程序运行时,正在调用外部模块上的 Load,并将依赖项注入(inject)到页面中。

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

此时,当尝试将 View (此处为用户控件)添加到页面时,不会显示任何内容。这与 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..." });

最后是 View /用户控件:

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" />

最佳答案

通过使用用户控件作为资源调用 Page.LoadControl 可以实现此功能。

Page.LoadControl(typeof(controls_controls_MyCustomUserControlView), null) 不起作用,但 Page.LoadControl("controls_MyCustomUserControlView.ascx") 起作用。

由于控件位于外部程序集中,因此首先创建一个 VirtualPathProvider 和 VirtualFile,如所讨论的 http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx

自定义 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;
}

“Plugins”只是一个前缀,用于在 VirtualPathProvider 中确定控件是否位于另一个程序集中。

如果您的用户控件有命名空间,请确保在 LoadControl 中为控件名称添加前缀。另一件事是确保使用 CodeBehind 而不是 CodeFile,因为 ASP.NET 将尝试加载 CodeBehind 文件。

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

关于asp.net - 在 WebForms 中使用 Ninject 注入(inject) Web 用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com