這個功能是在DTcms Demo網站里面扣出來的一個小功能,他的Demo網站里面可以在HTML寫好所有的代碼,然后生成一下ASPX頁面,就可以訪問了。具體的流程下篇文章來分析。這篇文章主要是講HTML如何生成ASPX頁面。
原理:
我們先讀取HTML頁面,然后拼接字符串(組成ASPX頁面的結構的字符串),然后創建ASPX頁面把字符串利用File操作寫進ASPX頁面。
例如:
我們要生成的ASPX頁面的結構大致如下(截圖是最簡單的,沒有涉及數據的交互,只是靜態字符串)
靜態頁面:
生成ASPX頁面代碼如下
//需要生成ASPX頁面的靜態頁面 string templetFullPath = HttpContext.Current.Server.MapPath("/Html/Test.html"); //讀取靜態文件 using (StreamReader objReader = new StreamReader(templetFullPath, Encoding.UTF8)) { StringBuilder textOutput = new StringBuilder(70000); textOutput.Append(objReader.ReadToEnd()); //把文件讀取到StringBuilder中 string oldStr = textOutput.ToString(); string newStr = ""; newStr = oldStr;
//重點
//替換特殊標記 newStr = newStr.Replace("\r\n","\\r\\n");
newStr = newStr.Replace("\"", "\\\"");
//我們把 </script> 整個寫到 tempplateBulder 里面無法正確顯示,需要拆分開, 寫到兩個Append()里面 newStr = newStr.Replace("</script>", "</\");\r\n\ttemplateBuilder.Append(\"script>");
StringBuilder sbStr = new StringBuilder(); //添加頁面頭部 Inherits 這個屬性的值必須對應正確 sbStr.AppendFormat("<%@ Page Language =\"C#\" AutoEventWireup=\"true\" Inherits=\"{0}\" ValidateRequest=\"false\" %>\r\n", "DTcmsTest.Test"); //命名空間 根據頁面需求自己添加 用到一些的命名空間,也可以在對應的*.cs文件里面引用 sbStr.Append("<%@ Import namespace=\"System.Text\" %>\r\n"); //添加可以寫后台代碼的腳本 sbStr.Append("<script runat =\"server\">\r\nprotected override void OnInit(EventArgs e)\r\n"); sbStr.Append("{ \r\n\r base.OnInit(e);\r\n\t");
//基本上就這段代碼是動態的,其他的都是一樣的 //利用StringBuilder輸出頁面 先把HTML全部讀取到StringBuilder里面然后在輸出 sbStr.AppendFormat("StringBuilder templateBuilder = new StringBuilder({0});\r\n\t",textOutput.Capacity); sbStr.AppendFormat("templateBuilder.Append(\"{0}\");\r\n\t", newStr);
sbStr.Append("Response.Write(templateBuilder.ToString());\r\n }\r\n"); sbStr.Append("</script>\r\n");
string pageDir = HttpContext.Current.Server.MapPath("/HTML"); string outputPath = pageDir + "\\Test.aspx"; //生成文件的物理路徑 //如果物理路徑不存在則創建 if (!Directory.Exists(pageDir)) { Directory.CreateDirectory(pageDir); }
//重點 //保存寫入文件 File.WriteAllText(outputPath, sbStr.ToString(), Encoding.UTF8); context.RewritePath("/HTML/Test.aspx");
生成ASPX頁面的字符串注意點:
我們是利用File創建一個ASPX頁面,然后進入寫入數據的,它會識別一些特殊的標記。
列如:
我們寫了一些帶特殊符號的字符串,利用File寫入文件
我們需要在后台代碼中輸出一開始獲取的HTML頁面數據,不能破壞,所以才需要替換
如果我們需要寫后台代碼,我們新建一個*.cs文件,名字跟ASPX頁面一樣,然后讓類繼承 Page就可以了。
這里說的只是原理,沒有涉及到數據交互。