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

C# 依 HTML 範本動態產生靜態頁面:ASPxToHtml 類別完整實作

     編輯:關於C語言

核心原理

動態產生靜態 HTML 頁面的經典模式:

  1. 準備 HTML 範本檔,以特殊標記(如 $Title$、$Content$)標示動態區塊。
  2. 程式讀取範本內容至字串。
  3. 以 String.Replace 將標記替換為實際資料。
  4. 將結果寫入 .html 檔案。

ASPxToHtml 類別架構

完整類別包含:

  • 設定屬性: 範本路徑、輸出路徑、編碼(預設 Big5/GB2312)、錯誤日誌路徑。
  • 參數管理: 兩組平行陣列 _templateFileparameter(範本標記)與 _ASPxFileparameter(替換值),透過 TemplateParamCount 同步長度。
  • 核心流程: StartConvert() → writeFile()(讀取→替換)→ saveFile()(寫入)→ 回傳產生檔名。
  • 檔名產生: getFileName() 以「年月日時分秒毫秒+隨機數」確保唯一性。
  • 錯誤記錄: WriteErrFile() 將例外詳細資訊附加寫入日誌檔。

關鍵程式碼片段

建構子與設定

public class ASPxToHtml
{
    private int _templateParamCount = 0;
    private string _templateFilePath = ConfigurationManager.AppSettings["TemplateFilePath"];
    private string _htmlFilePath = ConfigurationManager.AppSettings["HtmlFilePath"];
    private Encoding _templateEncoding = Encoding.GetEncoding("utf-8"); // 建議改用 UTF-8
    private Encoding _outputEncoding = Encoding.GetEncoding("utf-8");
    private string[] _templateParams;
    private string[] _valueParams;

    public int TemplateParamCount
    {
        get => _templateParamCount;
        set
        {
            if (value < 0) throw new ArgumentException();
            _templateParamCount = value;
            _templateParams = new string[value];
            _valueParams = new string[value];
        }
    }
    // ... 其他屬性省略
}

核心轉換邏輯

public string StartConvert()
{
    if (_templateParams.Length != _valueParams.Length) return null;
    return WriteFile();
}

private string WriteFile()
{
    string physicalTemplatePath = HttpContext.Current.Server.MapPath(TemplateFilePath);
    string templateContent;
    using (var sr = new StreamReader(physicalTemplatePath, _templateEncoding))
        templateContent = sr.ReadToEnd();

    for (int i = 0; i < TemplateParamCount; i++)
        templateContent = templateContent.Replace(_templateParams[i], _valueParams[i]);

    return SaveFile(templateContent);
}

private string SaveFile(string content)
{
    string physicalOutputDir = HttpContext.Current.Server.MapPath(HtmlFilePath);
    Directory.CreateDirectory(physicalOutputDir); // 確保目錄存在
    string fileName = GetFileName();
    string fullPath = Path.Combine(physicalOutputDir, fileName);

    using (var sw = new StreamWriter(fullPath, false, _outputEncoding))
        sw.Write(content);

    return fileName;
}

private string GetFileName()
{
    // 使用 Guid 更簡潔且唯一
    return $"{DateTime.Now:yyyyMMddHHmmssfff}_{Guid.NewGuid():N}.html";
}

改良建議(現代化重構)

  • 編碼統一 UTF-8: 避免 Big5/GB2312 相容性問題。
  • 使用 Dictionary<string, string>: 取代平行陣列,語意更清晰、效能更好。
  • 引入範本引擎: 如 Scriban、Handlebars.Net、RazorLight,支援條件判斷、迴圈、部分檢視等進階功能。
  • 非同步 I/O: StreamReader/Writer 改用 ReadToEndAsync/WriteAsync 提升併發效能。
  • 依賴注入: 移除對 HttpContext.Current 的靜態依賴,改注入 IWebHostEnvironment 取得實體路徑,利於單元測試。

使用範例

var generator = new ASPxToHtml(2)
{
    TemplateFilePath = "~/Templates/NewsTemplate.html",
    HtmlFilePath = "~/GeneratedHtml/News/"
};
generator.SetTemplateParams(new[] { "$Title$", "$Body$" });
generator.SetValueParams(new[] { "最新消息標題", "這是詳細內容..." });
string generatedFile = generator.StartConvert();
// 生成檔案如:20240520143025123_abc123.html
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved