2015-04-22 81 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)。好問題和一個很好的答案。 –

相關問題