簡體   English   中英

可以創建自定義ASP.NET(非MVC)指令嗎?

[英]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

您可能會對使用EnumerationMetadata Integerrogation關系類型感興趣來完成插件注冊/解析。

您可能還會發現使用MEF和WebForms的一些牽引力。 WebForms和MEF示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM