2015-04-22 35 views
3

我正在为我在工作中开发的一些网站设计一些高级定制框架,并且正在为它实现一个小插件系统。例如,我想在ASPX文件中以某种方式注册插件,然后在我的Page_Init函数中按顺序调用它们之后,可以挂接到不同的页面事件(Load,PreRender等)。可能创建一个自定义的ASP.NET(而不是MVC)指令?

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Plugin TypeName="MyFramework.Plugin.Core" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.MainMenu" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.IE6Hacks" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.Footer2015" Arg1="arg1" Arg2="arg2" %> 
<%@ Plugin TypeName="MyFramework.Plugin.SortableGridViews" Arg1="arg1" Arg2="arg2" %> 

<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>blah</title> 
</head> 
<body>  
    <form id="form1" runat="server"> Blah... </form> 
</body> 
</html> 

看到那些<% Plugin %>指令:所以你看,我想做什么我都会直接跳转到该代码?它们不存在于ASP.NET中,但我想创建它们。我在谷歌上找不到关于这些东西的东西。是否可以创建一个自定义的?

我的想法是,一旦他们“注册”了这些指令,我就可以遍历所有这些指令(存储在数组中,每次指令被击中或存储在Page_Init事件中)并相应地执行。

另一个想法我是使用代码块来代替:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<% RegisterPlugin("MyFramework.Plugin.Core"); %> 
<% RegisterPlugin("MyFramework.Plugin.MainMenu"); %> 
<% RegisterPlugin("MyFramework.Plugin.IE6Hacks"); %> 
<% RegisterPlugin("MyFramework.Plugin.Footer2015"); %> 
<% RegisterPlugin("MyFramework.Plugin.SortableGridViews"); %> 

<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>blah</title> 
</head> 
<body>  
    <form id="form1" runat="server"> Blah... </form> 
</body> 
</html> 

但功能得到后所有页面事件,而不是之前运行的(或至少的Page_Load前)离开我,没有叫检测我是否已经注册了插件,以便在我的基页的Page_Load事件等中采取相应措施。

任何想法都非常感谢:)。提前致谢!

回答

3

ASP.NET页面解析器不支持自定义指令(尽管它支持页面或MasterPage指令上的自定义属性)。 但是你仍然可以使用服务器控件来做你想做的事情。

让我们假设你有一个基地插件类,像这样:

// we derive from control, so all plugins are automatically 
// added to the Page.Controls collection 
public class MyPluginBase : Control 
{ 
} 

而对于例如,两个插件类是这样的:

public class MyPlugin : MyPluginBase 
{ 
    public string MyFirstProperty { get; set; } 
    public int MySecondProperty { get; set; } 
} 

public class MyOtherPlugin : MyPluginBase 
{ 
    public string MyFirstProperty { get; set; } 
    public int MySecondProperty { get; set; } 
} 

然后,你可以写一个ASPX Web窗体(或ASCX)是这样的:

<%@ Page ... standard attributes ... %> 

<plugins:MyPlugin runat="server" MyFirstProperty="blah" MySecondProperty="1"></plugins:MyPlugin> 
<plugins:MyOtherPlugin runat="server" MyFirstProperty="blahblah" MySecondProperty="2"></plugins:MyOtherPlugin> 

etc... 

注意这个工作,你必须声明插件前缀的地方,for例如,在web.config中,像这样:

<configuration> 
    <system.web> 
    <pages> 
     <controls> 
     <!-- all assemblies & namespaces that contain plugins classes --> 
     <add assembly="WebApplication1" namespace="WebApplication1.Code" tagPrefix="plugins" /> 
     <add assembly="MyOtherPlugins" namespace="MyOtherPlugins.Plugins" tagPrefix="plugins" /> 
     </controls> 
    </pages> 
    </system.web> 
</configuration> 

而在背后类的代码,你就可以自动访问该插件,在所有的活动,包括初始化,用这样的代码:

public partial class WebForm1 : Page 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     // get all plugins on the page 
     var plugins = Controls.OfType<MyPluginBase>(); 
    } 
} 
+0

你走了,这就是你如何做到这一点DARKGuy。再次被全明星带走的赏金(LOL)。好问题和一个很好的答案。 –

相关问题