asp.net的cms 核心代码篇

第一篇,我简略描述了一下我的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啦。

(0)

相关推荐

  • CentOS上运行ZKEACMS的详细过程

    ZKEACMS Core 是基于 .net core 开发的,可以在 windows, linux, mac 上跨平台运行,接下来我们来看看如何在 CentOS 上运行 ZKEACMS. 安装 .Net Core 运行时 运行以下命令,安装 .Net Core Runtime sudo yum install libunwind libicu curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=843420 sud

  • asp.net的cms 原理篇

    昨晚稍微写了一点,我订制的cms系统的标签,今天我把标签所代替的代码也写出来. 我的方法很简单,就是"替换"二字. 例①HTML--绑定数据 复制代码 代码如下: <!--{an:alist filed=[title,time] category=[#] num=[10] page=[true] sort=[time desc]}--> <li><span class="fr_time">${2}</span><

  • asp.net小孔子cms中的数据添加修改

    题外话:我为什么研究小孔子的cms,从我自己写一个cms我就开始研究起别人的cms,早期我是研究netcms,但这系统过于庞大,看上去十分的累,也没那个精力,于是打算从一套比较小的开始研究,于是小孔子cms就进入了我的研究范围.没过多久我就放下我手中的cms,决定研究清楚有了更多经验再继续写完我没有完成的cms. 最近都在看小孔子cms的代码,其添加与修改数据十分方便,做下笔记,代码主要提取自小孔子cms,去掉了不用的函数并把相关代码写到一个文件中: 结合上面的图片,当我们要往数据库中添加数据时

  • asp.net的cms 绑定数据篇

    半年前,在博客园写了asp.net cms 的几篇文章,那时候,是我的cms还没做出来.都是些夸夸其谈. 现在我已经删除了那几篇. 今天,写这篇,是想感慨一下. 现在我的CMS也核心也快大致完成了. 姑且管这个 c#版的cms叫:anCms anCms的基本语法: 1.绑定数据 复制代码 代码如下: 整个语法说明: 开始标记<!--{an:方法名 filed=[字段1,字段2,字段3] sort=[字段 asc|desc] category=[分类ID] id=[编号ID] keyword=[]

  • ZKEACMS for .Net Core深度解析

    ZKEACMS 简介 ZKEACMS.Core 是基于 .Net Core MVC 开发的开源CMS.ZKEACMS可以让用户自由规划页面布局,使用可视化编辑设计"所见即所得",直接在页面上进行拖放添加内容. ZKEACMS使用插件式设计,模块分离,通过横向扩展来丰富CMS的功能. 响应式设计 ZKEACMS使用Bootstrap3的栅格系统来实现响应式设计,从而实现在不同的设备上都可以正常访问.同时站在Bootstrap巨人的肩膀上,有丰富的主题资源可以使用. 简单演示 接下来看看程

  • asp.net的cms 核心代码篇

    第一篇,我简略描述了一下我的cms标签所表示的含义.anCMS(c#版)第一篇绑定数据 第二篇,我将展示了标签背后真正运行的代码.asp.net的cms 原理篇 好像开源有点多余,核心代码就下面这些. 复制代码 代码如下: using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace an.helper { ///

  • ASP+XML实例演练编程代码第1/3页

    实例演练ASP+XML编程 本文是一篇实例讲解的文章.作为一个普通的程序员,我深知,一个优秀的例程,对于正在学习编程的人是多么的有帮助.本文中使用的例程,是一个联系信息管理程序,我也是写来以方便自己和朋友们互相联系用的.但麻雀虽小,五脏俱全,相信对正在学习ASP+XML编程的朋友们,还是具备一定的参考价值的. 读者可以通过此实例,了解在ASP(Active Server Page)中如何操纵XML文件,并进行数据的各种处理,包括XML节点的建立.修改.删除和保存等等.文中涉及到的技术包括ASP,

  • ASP 百度主动推送代码范例

    范例代码 function BytesToBstr(body,Cset)     dim objstream  set objstream = Server.CreateObject("adodb.stream") objstream.Type = 1  objstream.Mode =3  objstream.Open  objstream.Write body  objstream.Position = 0  objstream.Type = 2  objstream.Charse

  • 掌握Android Handler消息机制核心代码

    目录 一.handler基本认识 1.基本组成 2.基本使用方法 3.工作流程 二.发送消息 三.消息进入消息队列 1.入队前的准备工作 2.将消息加入队列 四.从消息队列里取出消息 1.准备工作 2.loop中的操作 2.1 MessageQueue的next方法 五.消息的处理 六.其他关键点 1. Loop的创建 2.Handler的创建 3.Message的创建.回收和复用机制 4. IdleHandler 5.Handler在Framework层的应用 阅读前需要对handler有一些

  • asp防止刷新功能实现代码

    使用说明 1.在要保护的页面顶部加如对AntiRefresh.asp文件的引用如: <!--#include virtual="AntiRefresh.asp" --> 2.接着添加调用代码 复制代码 代码如下: <% Const VarNameDateArr="www_domai_net_App_DataArr" '队列名称 Const VarNameIPArr="www_domai_net_App_IPArr" '队列名称

  • Java校验银行卡是否正确的核心代码

    多说无益,贴代码: /** * 校验银行卡卡号 * * @param cardId * @return */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId .substring(0, cardId.length() - 1)); return cardId.charAt(cardId.length() - 1) == bit; } /** * 从不含校验位的银

  • iOS中navigationController 去掉背景图片、去掉底部线条的核心代码

    废话不多说了,直接给大家贴iOS中navigationController 去掉背景图片.去掉底部线条的核心代码,关键代码如下所示: //去掉背景图片 复制代码 代码如下: [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; //去掉底部线条 复制代码 代码如下: [self.navigationControll

  • 深入解析js轮播插件核心代码的实现过程

    轮播效果在网页中用的很多,swiper是其中最有代表性的作品,它支持水平和竖直滑动,还有反弹效果,兼容移动端和pc端.当然代码量也是相当大的,单是js就有5300行(3.4.0的未缩版本),若不考虑代码利用率和加载速度直接就用了,在移动端比较慎重,比如京东(m.jd.com)的轮播就没有用它,而是自己实现了类似的功能,代码量很少的样子(格式化之后看起来二三百行左右的样子).那么这个功能如果自己来实现,要怎么做呢? 准备工作 1. 准备几张图片(我这里放了四张) 2. 搭建目录结构(html+cs

随机推荐