asp.net的cms 核心代码篇

时间:2022-06-20 13:30:08

第一篇,我简略描述了一下我的cms标签所表示的含义。anCMS(c#版)第一篇绑定数据 

第二篇,我将展示了标签背后真正运行的代码。asp.net的cms 原理篇

好像开源有点多余,核心代码就下面这些。 

复制代码代码如下:


using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace an.helper 

/// <summary> 
/// 查找html页面中可以转换成aspx页面的方法 的正则表达式 
/// </summary> 
public class HtmlToAspxMethod 

private static T_Validate tv=new T_Validate(); 
public static string ConvertMethodNameHtmlToAspx(string methodName) 

string str=""; 
switch(methodName) 

case "list ": str = "TextFile"; break; //文档 
case "listpager ": str = "TextFilePager"; break; //文档分页 
case "alist ": str = "Article"; break;//文章列表 
case "alistpager ": str = "ArticlePager"; break;//文章分页 
case "plist ": str = "Products"; break;//产品列表 
case "plistpager ": str = "ProductsPager"; break;//产品分页 
case "olist ": str = "One"; break;//单页列表 
case "olistpager ": str = "OnePager"; break;//单页分页 
case "clist ": str = "Category"; break; //分类列表 
case "clistpager ": str = "CategoryPager"; break; //分类列表 
case "llist ": str = "Link"; break;//连接列表 
case "llistpager ": str = "LinkPager"; break;//连接分页 
case "ilist ": str = "Images"; break;//图片集列表 
case "ilistpager ": str = "ImagesPager"; break;//图片集分页 
default: break; 

return str; 

public static string MethodListName = "list |listpager |alist |alistpager |plist |plistpager |olist |olistpager |clist |clistpager |llist |llistpager |ilist |ilistpager "; 
public static string MethodFiledName = "filed|num|category|keyword|sort|page|id"; 
/// <summary> 
/// 所有方法的入口,第一次运行时遍历该方法。 
/// </summary> 
public static string AllMethodContentRegex = "<!--{an:(" + MethodListName + ").*?}-->[\\s\\S]*?<!--{/an}-->"; 
public static List<string> AllMethodContent(string content) 

return Method.RegexStr(AllMethodContentRegex, content); 

/// <summary> 
/// 获取所有的方法 
/// </summary> 
public static string AllMethodRegex = "<!--{an:(" + MethodListName + ")[^}]*}-->"; 
public static List<string> AllMethod(string content) 

return Method.RegexStr(AllMethodRegex, content); 


/// <summary> 
/// 获取方法的函数名称 
/// </summary> 
public static string MethodNameRegex = "<!--{an:(" + MethodListName + ")"; 
public static string MethodName(string content) 

string str = ""; 
var c=Method.RegexStr(MethodNameRegex, content); 
if (c.Count>0) 

str = c[0].ToString(); 

return str.Replace("<!--{an:", ""); 

/// <summary> 
/// 获取方法的字段和值 
/// </summary> 
public static string MethodFiledRegex = "(" + MethodFiledName + ")=\\[[^]]+]"; 
public static Hashtable MethodFiled(string content) 

Hashtable ht = new Hashtable(); 
foreach (string s in Method.RegexStr(MethodFiledRegex, content)) 

string[] arr = s.Split('='); 
ht.Add(arr[0], arr[1].Replace("[", "").Replace("]", "")); 

return ht; 

public static string JsIncludeRegex = "<script.*rel=\"share\"[^>]*></script>"; 
public static string[] JsInclude(string html) 

string js = ""; 
List<string> list_include = Method.RegexStr(JsIncludeRegex, html); 
foreach (string inc in list_include) 

List<string> includeList = Method.RegexStr(@"\w+(?=\.js)", inc); 
if (includeList != null) 

js += includeList[0] + "(); "; 
html = html.Replace(inc, "<!--#include file=\"Share/" +includeList[0] + ".ascx\"--> "); 


return new string[] { js, html }; 

/// <summary> 
/// 占位符 
/// </summary> 
public static string ValueOneRegex = @"\${\d+}"; 
public static string ValueOne(string content) 

foreach (string s in Method.RegexStr(ValueOneRegex, content)) 

string num = s.Replace("${", "").Replace("}", ""); 
content = content.Replace(s, "<%=a[" + num + "]%>"); 

return content; 


public static string ValueOneToStringFormartRegex = @"\${\d+\|.*?}"; 
public static string ValueOneToStringFormat(string content) 

foreach (string s in Method.RegexStr(ValueOneToStringFormartRegex, content)) 

string str = s.Replace("${", "").Replace("}", ""); 
string[] arr = str.Split('|'); 
string num = arr[0].ToString(); 
string formart = arr[1].ToString(); 
content = content.Replace(s, "<%=TimeFormart(a[" + num + "],\"" + formart + "\")%>"); 

return content; 


public static string UrlRouteRegex = @"\$href\[\w+\]\[.*?\]"; 
public static string UrlRoute(string content) 

foreach (string s in Method.RegexStr(UrlRouteRegex, content)) 

//$href[index][{"aaa","bbb"},{"ccc","ddd"}] 
//<%=UrlRoute("",new string[,]{{"aaa","bbb"},{"ccc","ddd"}});%> 
string urlRoute = s.Replace("$href[", "<%=UrlRoute(\""). 
Replace("][", "\",new string[,]{ "). 
Replace("#0", "a[0].ToString()"). 
Replace("#1", "a[1].ToString()"). 
Replace("#2", "a[2].ToString()"). 
Replace("#3", "a[3].ToString()"). 
Replace("#4", "a[4].ToString()"). 
Replace("#5", "a[5].ToString()"). 
Replace("#6", "a[6].ToString()"). 
Replace("#7", "a[7].ToString()"). 
Replace("#8", "a[8].ToString()"). 
Replace("#9", "a[9].ToString()"); 
urlRoute = urlRoute.Substring(0,urlRoute.Length - 1); 
urlRoute = urlRoute + "})%>"; 
content = content.Replace(s, urlRoute); 

return content; 

public static string PagingRegex = @"\$pager\[\w+\]\[.*?\]\[\d+\]"; 
public static string Paging(string content) 

//$pager[list][Category=$category$][15] 
//<%=Paging("list",new{Category=$category$}, int showCounts, object totleCounts)%> 
foreach (string s in Method.RegexStr(PagingRegex, content)) 

int numSite=s.LastIndexOf('['); 
string pager = s.Substring(0, numSite); 
string num = s.Substring(numSite).Replace("[", "").Replace("]", ""); 

pager = pager.Replace("$pager[", "<%=Paging(\""). 
Replace("][", "\",new string[,]{"); 
pager = pager.Substring(0, pager.Length - 1) + "}," + num + ",a[0])%>"; 
content = content.Replace(s, pager); 

return content; 



public static string LinkHrefRegex = "(?<=<link.*href=\")[^\"]*"; 
public static string ScriptSrcRegex = "(?<=<script.*src=\")[^\"]*"; 
public static string ImgSrcRegex = "<img.*rel=\"share\"[^>]*/>"; 
public static string TemplatePath = "<%=An_DoMain%>/Templates/"; 

public static string HrefHtml(string html) 

List<string> list_link = Method.RegexStr(LinkHrefRegex, html); 
foreach (string link in list_link.Distinct()) 

html = html.Replace(link, TemplatePath + link); 

List<string> list_script = Method.RegexStr(ScriptSrcRegex, html); 
foreach (string script in list_script.Distinct()) 

html = html.Replace(script, TemplatePath + script); 

List<string> list_img = Method.RegexStr(ImgSrcRegex, html); 
foreach (string img in list_img.Distinct()) 

html = html.Replace(img, img.Replace("src=\"", "src=\"" + TemplatePath)); 

return html; 



//public static string ForRegex = "<!--{for}-->[\\s\\S]*?<!--{/for}-->"; 
//public static string For(string arr, string content) 
//{ 
// foreach (string s in Method.RegexStr(ForRegex, content)) 
// { 
// string str = ""; 
// str = "<%if(1==1){var arr=" + arr + ";foreach(var s in arr){%>"; 
// str = str + s.Replace("<!--{for}-->", "").Replace("<!--{/for}-->", "") + "<%}}%>"; 
// content=content.Replace(s,str); 
// } 
// return content; 
//} 

public static string FnSplitContentRegex = @"\$split\[.*?\]\[.*?\]"; 
public static string FnSplitRegex = @"<!--{split}-->[\s\S]*?<!--{/split}-->"; 
public static string FnSplit(string content) 

foreach (string s in Method.RegexStr(FnSplitRegex, content)) 

var list_split = Method.RegexStr(FnSplitContentRegex, content); 
string splitMethod = ""; 
if (list_split != null) 

splitMethod = list_split[0].ToString(); 

if (splitMethod != "") 

string source = "", separator = ""; 
var list_split_value = splitMethod.Split(']'); 
if (list_split_value.Length > 0) 

source = list_split_value[0].Replace("$split[", ""); 
separator = list_split_value[1].Replace("[", ""); 
if (source != "") 

string str = ""; 
if (tv.IsInteger(source) == "") 

str = "<%if(1==1){var arr=a[" + source + "];foreach(var s in arr.Split('"+separator+"')){%>"; 

else 

str = "<%if(1==1){var arr=\"" + source + "\";foreach(var s in arr.Split('" + separator + "')){%>"; 

str += s.Replace(splitMethod, "<%=s%>").Replace("<!--{split}-->", "").Replace("<!--{/split}-->", ""); 
str += "<%}}%>"; 
content = content.Replace(s, str); 





return content; 






/// <summary> 
/// 将html方法转换成aspx的方法 
/// </summary> 
/// <param name="methodName"></param> 
/// <param name="content"></param> 
/// <returns></returns> 
public static AspxFiled HtmlFiledToAspxFiled(string methodName, string content) 

AspxFiled af = new AspxFiled(); 
Hashtable ht = MethodFiled(content); 
foreach (DictionaryEntry h in ht) 

if (h.Key.ToString() == "filed") 

af.Filed = h.Value.ToString(); 

if (h.Key.ToString() == "num") 

if (tv.IsInteger(h.Value.ToString()) == "") 

af.ShowCounts = Convert.ToInt32(h.Value.ToString()); 
if (af.ShowCounts < 0) 

af.ShowCounts = 1; 


else 

af.ShowCounts = 10; 


if (h.Key.ToString() == "sort") 

af.Sort = h.Value.ToString(); 

if (h.Key.ToString() == "page") 

if (h.Value.ToString() == "true") 

af.Current = "An_Current"; 

else 

af.Current = "1"; 


if (h.Key.ToString() == "category") 

af.CategoryID = h.Value.ToString(); 

if (h.Key.ToString() == "keyword") 

af.Keyword = h.Value.ToString(); 

if (h.Key.ToString() == "id") 

af.ID = h.Value.ToString(); 


return af; 


public static string AspxMethodDataSet(string methodName,string content,string datatableName) 

AspxFiled af = HtmlFiledToAspxFiled(methodName, content); 
string str = ""; 
if (methodName.Contains("pager")) 

if (methodName == "clistpager ") 

str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.CategoryID + "\"));"; 

else 

str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.ID + "\",\"" + af.CategoryID + "\",\"" + af.Keyword + "\"));"; 


else 

if (methodName == "clist ") 

str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.Filed + "\", " + af.Current + ", " + af.ShowCounts + ", \"" + af.Sort + "\", \"" + af.CategoryID + "\"));"; 

else 

str = "MyHashtable.Add(\"" + datatableName + "\", " + ConvertMethodNameHtmlToAspx(methodName) + "(\"" + af.Filed + "\", " + af.Current + ", " + af.ShowCounts + ", \"" + af.Sort + "\", \"" + af.ID + "\", \"" + af.CategoryID + "\", \"" + af.Keyword + "\"));"; 


return str; 

public static string AspxMethodDataRow(string datatableName,string content) 

return "<%if(1==1){var myRows = MyRows(\"" + datatableName + "\"); if (myRows != null){foreach (var a in myRows){ %>" + content + "<%}}else{%><p style='margin:10px;'>没有相关信息</p><%}}%>"; 


public static string ServerFunction(string content) 

return "<script runat=\"server\">protected override void OnLoad(EventArgs e){" + content + "}</script>"; 

public static string ServerFunction(string content, string fnName) 

return "<script runat=\"server\">public void " + fnName + "(){" + content + "}</script>"; 




public class AspxFiled 

private string _Filed; 
public string Filed 

get{ return _Filed; } 
set 

if (value.Contains("TextFile.ID,")) 

_Filed = value; 

else 

_Filed = "TextFile.ID," + value; 



private string _ID = ""; 
public string ID 

get { return _ID; } 
set { _ID = value; } 

private string _CategoryID = ""; 
public string CategoryID 

get { return _CategoryID; } 
set { _CategoryID = value; } 

private string _Keyword = ""; 
public string Keyword 

get { return _Keyword; } 
set { _Keyword = value; } 


private string _Sort; 
public string Sort 

get { return _Sort; } 
set { _Sort = value; } 

private int _ShowCounts = 0; 
public int ShowCounts 

get{return _ShowCounts;} 
set { _ShowCounts = value; } 

private string _Current = "1"; 
public string Current 

get { return _Current; } 
set { _Current = value;} 


/// <summary> 
/// html和aspx的方法名称对应替换 
/// </summary> 
public class ConvertHtmlToAspx 

public string DataTableName(int num,string name) 

return Method.Md5(DateTime.Now.ToLongDateString() + new Random().Next(1000) + num + new Random().Next(1000) + name); 

public string ToAspx(string html,string ascxName) 

html = AllToAspx(html); 
List<string> list_AllMethodContent = HtmlToAspxMethod.AllMethodContent(html); 
string load = ""; 
int i = 0; 
foreach (string allMethodContent in list_AllMethodContent) 

i++; 
string allMethod = HtmlToAspxMethod.AllMethod(allMethodContent)[0];//<!--{an:list}--> 
string methodName = HtmlToAspxMethod.MethodName(allMethod);//方法名称<!--{an:list 
Hashtable methodFiled = HtmlToAspxMethod.MethodFiled(allMethod);//filed=[title] sort=[time desc] 
string content = allMethodContent.Replace(allMethod, "").Replace("<!--{/an}-->", ""); 
content = HtmlToAspxMethod.ValueOne(content); 
content = HtmlToAspxMethod.ValueOneToStringFormat(content); 
string dataTableName = DataTableName(i,ascxName); 
load += HtmlToAspxMethod.AspxMethodDataSet(methodName, allMethod, dataTableName); 
content = HtmlToAspxMethod.AspxMethodDataRow(dataTableName, content); 
html = html.Replace(allMethodContent, content); 

if (ascxName == "") 

string[] js=HtmlToAspxMethod.JsInclude(html); 
html = js[1]; 
load += js[0]; 
load = HtmlToAspxMethod.ServerFunction(load); 

else 

load = HtmlToAspxMethod.ServerFunction(load, ascxName); 

html = HtmlToAspxMethod.HrefHtml(html);//链接转换 
return load + html; 

private string AllToAspx(string html) 

html = html.Replace("$categoryname", "<%=An_CategoryName%>"); 
//html = html.Replace("$title$", "<%=An_Title%>").//页面标题 
// Replace("$keywords$", "<%=An_KeyWords%>").//页面关键词 
// Replace("$description$", "<%=An_Description%>").//页面描述 
// Replace("$domain$", "<%=An_DoMain%>").//网站域名 
// Replace("$categoryname$", "<%=An_CategoryName%>").//分类名称 
// Replace("$contact$", "\"+An_Contact+\"").//联系我们 
// Replace("$id$", "An_ID").//明细ID 
// Replace("$category$", "An_CategoryID").//分类ID 
// Replace("$tongji$", "<%=An_TongJi%>"). 
// Replace("$keyword$", "\"+An_KeyWord+\"");//搜索的关键词 
html = HtmlToAspxMethod.UrlRoute(html); 
html = HtmlToAspxMethod.Paging(html); 
html = HtmlToAspxMethod.FnSplit(html); 

return html; 



}


呵呵,会不会太肤浅了。 

主要就是通过上面这个代码,将html模版通过替换后变成aspx来运行。 

我要去完善我的CMS啦。