[英]Create a custom ASP.NET (not MVC) directive possible?
我正在為我正在開發的一些網站開發一個有點高級的自定義框架,我正在為它實現一個小插件系統。 我想以某種方式在ASPX文件中注冊插件,以便我可以在我的Page_Init函數中按順序調用它們之后掛鈎到不同的頁面事件(Load,PreRender等)。 我會直接跳到代碼中,看看我想做什么:
<%@ 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事件等中相應地執行操作。
任何想法都非常感謝:)。 提前致謝!
ASP.NET頁面解析器不支持自定義指令(盡管它支持Page或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 webform(或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...
注意這個工作,你必須在某處聲明插件前綴,例如在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>
在類后面的代碼中,您可以在包括Init在內的所有事件中自動訪問插件,代碼如下:
public partial class WebForm1 : Page
{
protected void Page_Init(object sender, EventArgs e)
{
// get all plugins on the page
var plugins = Controls.OfType<MyPluginBase>();
}
}
使用像Autofac這樣的依賴注入容器,它支持WebForms 。
您可能會對使用Enumeration或Metadata Integerrogation關系類型感興趣來完成插件注冊/解析。
您可能還會發現使用MEF和WebForms的一些牽引力。 WebForms和MEF示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.