asp.net的cms 核心代码篇
asp.net的cms 核心代码篇
发布时间:2016-12-29 来源:查字典编辑
摘要:第一篇,我简略描述了一下我的cms标签所表示的含义。anCMS(c#版)第一篇绑定数据第二篇,我将展示了标签背后真正运行的代码。asp.ne...

第一篇,我简略描述了一下我的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 = "<>[sS]*?<>";

public static List<string> AllMethodContent(string content)

{

return Method.RegexStr(AllMethodContentRegex, content);

}

/// <summary>

/// 获取所有的方法

/// </summary>

public static string AllMethodRegex = "<>";

public static List<string> AllMethod(string content)

{

return Method.RegexStr(AllMethodRegex, content);

}

/// <summary>

/// 获取方法的函数名称

/// </summary>

public static string MethodNameRegex = "<{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, "<> ");

}

}

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 = "<>[sS]*?<>";

//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("<>", "").Replace("<>", "") + "<%}}%>";

// content=content.Replace(s,str);

// }

// return content;

//}

public static string FnSplitContentRegex = @"$split[.*?][.*?]";

public static string FnSplitRegex = @"<>[sS]*?<>";

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("<>", "").Replace("<>", "");

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>没有相关信息</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];//<>

string methodName = HtmlToAspxMethod.MethodName(allMethod);//方法名称<{/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啦。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类