文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 11:35

关注

这篇文章主要介绍了C#递归应用之如何实现JS文件的自动引用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#递归应用之如何实现JS文件的自动引用文章都会有所收获,下面我们一起来看看吧。

背景

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

截图如下:

sys_tbl

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

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

其中,字段 名称包含对其它名称(对象) 的引用,写法为:表名(去除下划线)_引用字段 ,如: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文件的自动引用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯