• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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 Liststring> AllMethodContent(string content)
    {
    return Method.RegexStr(AllMethodContentRegex, content);
    }
    /// summary>
    /// 获取所有的方法
    /// /summary>
    public static string AllMethodRegex = "!--{an:(" + MethodListName + ")[^}]*}-->";
    public static Liststring> 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 = "";
    Liststring> list_include = Method.RegexStr(JsIncludeRegex, html);
    foreach (string inc in list_include)
    {
    Liststring> 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)
    {
    Liststring> list_link = Method.RegexStr(LinkHrefRegex, html);
    foreach (string link in list_link.Distinct())
    {
    html = html.Replace(link, TemplatePath + link);
    }
    Liststring> list_script = Method.RegexStr(ScriptSrcRegex, html);
    foreach (string script in list_script.Distinct())
    {
    html = html.Replace(script, TemplatePath + script);
    }
    Liststring> 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);
    Liststring> 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啦。
    您可能感兴趣的文章:
    • ZKEACMS for .Net Core深度解析
    • asp.net的cms 原理篇
    • asp.net的cms 绑定数据篇
    • asp.net小孔子cms中的数据添加修改
    • CentOS上运行ZKEACMS的详细过程
    上一篇:asp.net的cms 原理篇
    下一篇:收集学习asp.net比较完整的面向对象开发流程
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    asp.net的cms 核心代码篇 asp.net,的,cms,核心,代码,