C#递归应用之实现JS文件的自动引用

目录
  • 背景
  • 需求
  • 分析
    • 1、返回结果类型
    • 2、算法选择
  • 代码实现

背景

两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息);sys_fld 是记录第张表中的字段 的名称(field)和描述信息(table) ,

截图如下:

sys_tbl

其中,字段 名称包含对其它名称(对象) 的引用,写法为:表名(去除下划线)_引用字段 ,如:einventory_cinvcode,就是对表 e_inventory 中字段 cinvcode的引用。

每张表都在系统 中对应有不同功能的js文件(模块)如: 编辑窗体(dialog类型),跨域选择窗体(field)类型等

需求

在一个综合的页面中,会对其它对象进行引用(依赖),而这种引用最终体现在对js文件的包含。同时被引用的js 文件(一级引用)还有自已关联对象(二级引用).....如此下去,直到N 级引用。

所以现在需要逐层找到对象的引用,直到最后不依赖任何对象为止,并把这些js文件生成引用包含路径(不重复)

分析

1、返回结果类型

得到这些js引用,不能重复,但是对象之间引用是可以存在交叉的,在整个引用链条上,同一个对象会被 多个对象引用,所以简单的字符串数组是避免不了重复的。但是在C#中的HashSet可以做到不重复,同时这个去重工作是自动完成的,所以存结果如果是简单的value类型,用 HashSet就可以,但是因为字段中表的信息已经被格式化过,所以还要把格式化之前的表名称取出与字段对应,所以需要一个key-value类型的数据 ,那就是 Dictionary<string, string> 了。

2、算法选择

因为查找引用,是层层进行的,而且下一层引用的要用到上一层的引用结果,所以这里选择递归算法

代码实现

声明一个全局变量,记录所有的表与字段的对应的数据,因为需要确保数据key 唯一性所以选择Dicctionary类型

/// <summary>
        /// define the gloable parameter to save the rel obj data
        /// </summary>
        public static Dictionary<string, string> <strong>deepRef </strong>= new Dictionary<string, string>();

入口函数,完成准备工作,(数据库连接,参数准备)

/// <summary>
        /// 通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止
        /// </summary>
        /// <param name="headField">表字段列表</param>
        /// <returns></returns>
        public static Dictionary<string,string>  getRelRef(List<IniItemsTableItem> headField)
        {
            HashSet<string> refset = new HashSet<string>();
           // HashSet<string> refset_result = new HashSet<string>();
            foreach (var item in headField)
            {
                if (!item.controlType.StartsWith("hz_"))// is not the field of  reference
                {
                    continue;
                }
                string[] fieldarr = item.dataIndex.Split('_');//the constructor is :[tabble]_[field]

                refset.Add(fieldarr[0]);//the first prefix

            }
            dataOperate dao = new dataOperate();
            dao.DBServer = "info";
            SqlConnection conn = dao.createCon();
            try
            {
                if (refset.Count > 0)
                {

                    if (conn.State != ConnectionState.Open)
                        conn.Open();//open connection
                    deepRef = new Dictionary<string, string>();//clear the relation obj data
                    getRef(conn, refset);

                }
                return deepRef;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }

        }

递归函数,最终完成在数据库中获取字段依赖的对象的获取

/// <summary>
        /// get the relation obj
        /// </summary>
        /// <param name="conn"></param>
        /// <param name="ref_field"></param>
        /// <returns></returns>
        public static HashSet<string> <strong>getRef</strong>(SqlConnection conn, HashSet<string> ref_field)
        {
            HashSet<string> refset = new HashSet<string>();

            string refstr = string.Join("','", ref_field);
            if (refstr != "")
            {
                refstr = "'" + refstr + "'";

                string sql = "SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (" + refstr + ") and uitype='ref'";
                //get dataset relation obj
                DataSet ds = dataOperate.getDataset(conn, sql);
                if (ds != null && ds.Tables.Count > 0)
                {
                    DataTable dt = ds.Tables[0];
                    if (dt.Rows.Count > 0)
                    {
                        //rel ref exists
                        for (int k = 0; k < dt.Rows.Count; k++)
                        {
                            string vt = dt.Rows[k].ItemArray[0].ToString();
                             string vv = dt.Rows[k].ItemArray[1].ToString();
                            refset.Add(vt);//save current ref
                            if(!<strong>deepRef</strong>.ContainsKey(vt))
                                <strong>deepRef</strong>.Add(vt, vv);// save all ref

                        }
                        if (refset.Count > 0)// get the ref successfully
                        {
                            //recursion get
                            getRef(conn, refset);
                        }

                    }

                }

            }
            else
            {
                //no ref
            }
            return refset;
        }

对函数进行调用,并组织出js文件引用路径

Dictionary<string,string> deepRef = ExtjsFun.getRelRef(HeadfieldSetup);
            if (deepRef != null)
            {
                foreach (var s in deepRef)
                {
                    string tem_module = "";
                    tem_module = s.Value;
                    string[] moduleArr = tem_module.Split('_');
                    if (tem_module.IndexOf("_") >= 0)
                        tem_module = moduleArr[1];//module name for instance: p_machine ,the module is “machine” unless not included the underscore
                    string fieldkind = "dialog";
                    jslist.Add(MyComm.getFirstUp(tem_module) + "/" + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + ".js");
                    fieldkind = "field";
                    jslist.Add(MyComm.getFirstUp(tem_module) + "/" + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + ".js");
                }
            }

最终结果 如下:

<script src="../../dept/demoApp/scripts/Sprice/SpriceE_spriceGridfield.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Org/OrgE_orgDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Unit/UnitE_unitDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Unit/UnitE_unitField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Wh/WhWh_whDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Wh/WhWh_whField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Mold/MoldP_moldDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Mold/MoldP_moldField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Bank/BankOa_bankDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Bank/BankOa_bankField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Machine/MachineP_machineDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Machine/MachineP_machineField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Inventory/InventoryE_inventoryDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeField.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Tax/TaxE_taxDialog.js" type="text/javascript"></script>
      <script src="../../dept/demoApp/scripts/Tax/TaxE_taxField.js" type="text/javascript"></script>

完事代码如下:

/// <summary>
        /// define the gloable parameter to save the rel obj data
        /// </summary>
        public static Dictionary<string, string> deepRef = new Dictionary<string, string>();
        /// <summary>
        /// 通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止
        /// </summary>
        /// <param name="headField">表字段列表</param>
        /// <returns></returns>
        public static Dictionary<string,string>  getRelRef(List<IniItemsTableItem> headField)
        {
            HashSet<string> refset = new HashSet<string>();
           // HashSet<string> refset_result = new HashSet<string>();
            foreach (var item in headField)
            {
                if (!item.controlType.StartsWith("hz_"))// is not the field of  reference
                {
                    continue;
                }
                string[] fieldarr = item.dataIndex.Split('_');//the constructor is :[tabble]_[field]

                refset.Add(fieldarr[0]);//the first prefix

            }
            dataOperate dao = new dataOperate();
            dao.DBServer = "info";
            SqlConnection conn = dao.createCon();
            try
            {
                if (refset.Count > 0)
                {

                    if (conn.State != ConnectionState.Open)
                        conn.Open();//open connection
                    deepRef = new Dictionary<string, string>();//clear the relation obj data
                    getRef(conn, refset);

                }
                return deepRef;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }

        }

        /// <summary>
        /// get the relation obj
        /// </summary>
        /// <param name="conn"></param>
        /// <param name="ref_field"></param>
        /// <returns></returns>
        public static HashSet<string> getRef(SqlConnection conn, HashSet<string> ref_field)
        {
            HashSet<string> refset = new HashSet<string>();

            string refstr = string.Join("','", ref_field);
            if (refstr != "")
            {
                refstr = "'" + refstr + "'";

                string sql = "SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (" + refstr + ") and uitype='ref'";
                //get dataset relation obj
                DataSet ds = dataOperate.getDataset(conn, sql);
                if (ds != null && ds.Tables.Count > 0)
                {
                    DataTable dt = ds.Tables[0];
                    if (dt.Rows.Count > 0)
                    {
                        //rel ref exists
                        for (int k = 0; k < dt.Rows.Count; k++)
                        {
                            string vt = dt.Rows[k].ItemArray[0].ToString();
                             string vv = dt.Rows[k].ItemArray[1].ToString();
                            refset.Add(vt);//save current ref
                            if(!deepRef.ContainsKey(vt))
                                deepRef.Add(vt, vv);// save all ref

                        }
                        if (refset.Count > 0)// get the ref successfully
                        {
                            //recursion get
                            getRef(conn, refset);
                        }

                    }

                }

            }
            else
            {
                //no ref
            }
            return refset;
        }

以上就是C#递归应用之实现JS文件的自动引用的详细内容,更多关于C#递归实现JS文件引用的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#递归实现回文判断算法

    本文实例讲述了C#递归实现回文判断算法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: static void Main(string[] args) {     DateTime dt1 = DateTime.Now; string text = "abcdedcba";     bool bYes = Recv(text);     Console.Write("{0}:{1}回文!", text, bYes ? "是" :

  • c#递归生成XML实例

    本文实例讲述了c#递归生成XML的方法.分享给大家供大家参考.具体实现方法如下: 这里结合网上搜到的资料,写了个递归生成xml,经过调试可以使用,数据库结构如下图所示: 代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using Syste

  • c# 递归访问文件夹(删掉歌词文件)

    复制代码 代码如下: using System; using System.IO; namespace DelAllLrcFiles { class Program { static readonly string root = @"E:\我的音乐\Classic\"; static readonly string ext = ".lrc"; static void Main(string[] args) { DelAllLrc(root); } /// <s

  • C# 添加对System.Configuration.dll文件的引用操作

    却被编译器提示说: 警告 1 "System.Configuration.ConfigurationSettings.AppSettings" 已过时: "This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings" 于是转而想找到那个ConfigurationManager类来使

  • node.js文件操作系统实例详解

    本文实例讲述了node.js文件操作.分享给大家供大家参考,具体如下: 文件读取 普通读取 同步读取 var fs = require('fs'); var data; try{ data = fs.readFileSync('./fileForRead.txt', 'utf8'); console.log('文件内容: ' + data); }catch(err){ console.error('读取文件出错: ' + err.message); } 输出如下: /usr/local/bin/

  • angularjs ocLazyLoad分步加载js文件实例

    用angular有一段时间了,平日里只顾着写代码,没有注意到性能优化的问题,而今有时间,于是捋了捋,讲学习过程记录于此: 问题描述:由于采用angular做了网页的单页面应用,需要一次性在主布局中将所有模块需要引用到的js都引入.对于比较小的项目,这是可行的,但是对于大的项目,一旦js文件较多,在页面首次加载时就引入所有js文件,无疑会延缓页面加载的速度,造成不良额用户体验.那么分布加载(按需加载)就显得很有必要了. <!DOCTYPE html> <html lang="en

  • 同步异步动态引入js文件的几种方法总结

    动态加载js文件 有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求 一.直接加载 <div id="divId"></div> <script> 二.异步加载,并发执行,但引入js内容不能直接使用 //1.1 直接document.write document.write("<script src='test.js'><\/script>

  • Vue如何引入远程JS文件

    问题 最近在使用 Vue 做东西,用到钉钉扫描登录的功能,这里需要引入远程的 js 文件,因为 Vue 的方式跟之前的不太一样,又不想把文件下载到本地应用,找了一下解决的方法,貌似都需要引入第三方的库,最后找到了解决方案,分享之. 思路 一开始的思路是在 Vue 加载完 Dom 之后(mounted),使用 JavaScript 脚本在 body 中插入远程的脚本文件. 后来发现了 Vue 的 createElement 方法,简单的封装一个组件解决问题. 解决方法 第一版代码(直接在操作 Do

  • 自定义require函数让浏览器按需加载Js文件

    前言 本文介绍的是自定义require函数让浏览器实现按需加载Js文件,那到底要怎么自己写一个按需加载的库呢 为了实现按需加载: //这是我们要实现的功能,require('str.js')时加载str.js文件,并创建一个叫str对象,等加载完毕之后执行str对象的ready方法里的函数. var str = require('str.js'); str.ready(show); //要执行的函数 function show(res){ console.log(res); } //str.js

  • JS 文件传参及处理技巧分析

    解决思路: 1.首先获取到当前JS文件的SRC属性,这里有一个小技巧:我们只需要获取当前页面最后一个script标记内容即可. 为什么??因为JS是顺序解析的,当前JS脚本解析时后面的js都还没有解析到,当然就认为自己就是最后一个script了.此外,这样获取还有一个好处:我们可以多次引用同一个文件且传入不同的参数,这样可以在js文件中根据参数不同做不同处理,很巧妙把!简直就是动态语言了. 代码如下: 复制代码 代码如下: var scripts=document.getElementsByTa

  • eclipse如何忽略js文件报错(附图)

    忽略某个js文件报错的方法: Project Properties > JavaScript > Include Path > Source > 选中Exclude > 点击edit按钮 > 在下面的 Exclusion patterns 中添加对应的文件. 截图如下

  • js 文件引入实现代码

    也不好麻烦让他们从新写一个方法,由于他们都引用了这个AA.js文件,想在这边在AA.js后执行一个函数自动把jq库引入,于是想到引入js文件方法: 复制代码 代码如下: getScript : function(s,call){ var el = UI.DC('script');         if (call) {             el.onload =el.onreadystatechange=call;         }         UI.A(el,'type','text

  • js文件中直接alert()中文出来的是乱码的解决方法

    解决方法如下: 在这句语句上面加上echo "<meta http-equiv='Content-Type'' content='text/html; charset=utf-8'>"; 以上就是小编为大家带来的js文件中直接alert()中文出来的是乱码的解决方法全部内容了,希望大家多多支持我们~

  • javascript写的异步加载js文件函数(支持数组传参)

    自己用的加载js文件,支持多文件,不兼容ie 复制代码 代码如下: /** * 加载js文件 * @param  {string || array}   url   js路径 * @param  {Function} fn      加载完成后回调 * @return {object}           game对象 * @example * getScript("url.js",fn) * getScript(["url-1.js","url-2.js

随机推荐

其他