首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ASP.NET 單頁面架構:利用 IHttpHandlerFactory 與 AddParsedSubObject 實現 URL 驅動的用戶控件動態載入

     編輯:關於.NET

前言

傳統多版本網站(如中/英/日文)常面臨維護困境。本文提出「單一容器頁面 + HttpHandlerFactory 攔截 + XML 映射」架構,實現零程式碼擴充多版本頁面。

核心架構

  1. IHttpHandlerFactory 攔截所有 .aspx 請求,若實體頁面不存在則導向唯一容器頁 WebForm2.aspx
  2. 容器頁在 AddParsedSubObject 事件中,依請求 URL 從 XML 讀取對應用戶控件路徑
  3. 自訂容器控制項 MasterPageControl(繼承 HtmlContainerControl)動態 LoadControl 載入用戶控件

HttpHandlerFactory 實作

public class WebPageHandlerFactory : IHttpHandlerFactory
{
    public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string path)
    {
        if (IsExistedPage(path))
            return PageParser.GetCompiledPageInstance(url, path, context);

        if (!path.ToLower().EndsWith(".aspx"))
            path = Path.Combine(path, "webform2.aspx");

        url = ReplaceUrl(url);
        path = ReplaceUrl(path);
        return PageParser.GetCompiledPageInstance(url, path, context);
    }

    private bool IsExistedPage(string path) => path.ToLower().IndexOf("webform2.aspx") > 0;

    private string ReplaceUrl(string input)
    {
        return new Regex(@"\w+\.aspx").Replace(input, "webform2.aspx");
    }
    public void ReleaseHandler(IHttpHandler handler) { }
}

web.config 註冊:

<httpHandlers>
  <add verb="*" path="/*.aspx" type="WebApplication_Test.WebPageHandlerFactory, WebApplication_Test"/>
</httpHandlers>

容器頁面與動態載入邏輯

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication_Test.WebForm2" %>
<%@ Register TagPrefix="ccWebUI" Namespace="Common.UI" Assembly="Common.UI" %>
<ccWebUI:MasterPageControl id="MPContainer" runat="server"></ccWebUI:MasterPageControl>
public partial class WebForm2 : BasePage
{
    protected override void AddParsedSubObject(object obj)
    {
        base.AddParsedSubObject(obj);
        if (obj is MasterPageControl)
        {
            var config = new AppSettingPage(Context);
            if (!string.IsNullOrEmpty(config.TeamplateFilePath))
            {
                ((MasterPageControl)obj).Controls.Clear();
                ((MasterPageControl)obj).TemplateFile = config.TeamplateFilePath;
            }
        }
    }
}

URL 與控件映射設定

AppSettingPage 解析請求 URL,配合 TemplateConfig.xml 回傳控件路徑:

public class AppSettingPage
{
    public string TeamplateFilePath { get; private set; }
    public AppSettingPage(HttpContext context) { AnalysisUrl(context.Request.Url.ToString().ToLower()); }

    private void AnalysisUrl(string url)
    {
        foreach (var page in TemplateConfig.Pages())
            if (Regex.IsMatch(url, page.pattern, RegexOptions.IgnoreCase))
            { TeamplateFilePath = page.target_page; break; }
    }
}

TemplateConfig.xml:

<pages>
  <page pageName="index.aspx" target-page="index.ascx"/>
  <page pageName="index2.aspx" target-page="index2.ascx"/>
</pages>

多版本新聞頁範例:

<pages>
  <page pageName="中文新聞.aspx" target-page="中文新聞控件.ascx"/>
  <page pageName="英文新聞.aspx" target-page="英文新聞控件.ascx"/>
  <page pageName="日文新聞.aspx" target-page="日文新聞控件.ascx"/>
</pages>

基礎設施類別

  • BasePage:覆寫 Render 輸出完整 HTML 骨架
  • MasterPageControl:OnInit 呼叫 BuildMasterPage 載入用戶控件,隱藏自身標籤輸出

結語

此架構將頁面邏輯與控件載入完全解耦,新增版本僅需新增 .ascx 與 XML 設定,無須修改任何 C# 程式碼,極大降低維護成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved