从零开始编写自己的C#框架(21)——添加分类类型页面

简介:

页面权限与页面控件权限经过简单的调试后,终于启用起来了,以后大家添加新页面时,就必须按照本章介绍的方法,将你新增的页面注册到系统中,这样才能访问与进行相关操作。

  下面讲讲如何创建一个分类类型的页面。

  分类类型,顾名思义指的是按照一定规律、特点进行归类划分,放到一块的集合。我们开发时这些分类类型,经常用下拉列表来表现,如果有多级分类时,采用的是下拉树列表方式显示。

  普通下拉列表

  

  下拉树列表

  

 

  下面将介绍如何从创建数据表、修改文件到权限绑定逐个步骤进行说明。

  

  首先,我们先要创建好数据表

  我们打开数据字典,按数据字典中的格式,创建一个广告位置管理表

   然后打开大神July提供的SQL语句生成工具,生成数据表创建语句

  运行ExcelToSQLString2.91_sql.exe,选择《数据字典》的文件路径,设置想要生成SQL语句的表格名称,然后点击运行

   生成下面语句

   将生成的语句放到SQL的查询分析器中执行,生成数据表(见下图已生成的数据表)

   打开解决方案,找到数据层的SubSonic文件夹,按下图进行选择后,点击右键,找到“运行自定义工具”,点击重新运行生成数据层模板类

   找到逻辑层的SubSonic文件夹,按下图进行选择后,点击右键,找到“运行自定义工具”,点击重新运行生成逻辑层模板类

 

  通过以上操作,已经帮我们生成了底层我们需要调用到的常用实体和函数了,下面接着创建相关文件

 

  为了方便管理,我们在UI层后端管理文件夹(WebManage)中创建一个AdvertisingPositions文件夹,用于存放广告管理的相关文件

   已创建好文件夹

   打开Informations文件夹,将InformationClassList.aspx复制到AdvertisingPositions文件夹中(因为这两个文件的功能比较相似,所以直接复制过来修改)

  将InformationClassList.aspx改名为AdvertisingPositionList.aspx

   打开AdvertisingPositionList.aspx与AdvertisingPositionList.aspx.cs文件,按下面方式进行替换

  将页面中的“InformationClass”替换成“AdvertisingPosition”

   将页面中的“信息分类”替换为“广告位置”

   找到AdvertisingPositionList.aspx.cs文件的命名空间,将Informations替换成AdvertisingPositions,如下图

 

   同样找到AdvertisingPositionList.aspx文件也进行同面的替换

   经过替换,页面大体的功能就完成了。

 

  打开AdvertisingPositionList.aspx文件,将Grid中想要显示的列重新进行设置绑定(按下面内容进行修改,具体怎么使用FineUI,大家可以登陆FineUI官网查看在线示例,或者先按我代码中的内容尝试对控件属性进行增改操作后刷新页面,查看修改后的效果,弄上几个就很容易明白怎么使用了)

  View Code

 

 

  打开AdvertisingPositionList.aspx.cs文件,我们会看到一些调用函数不存在或是提示出错,那么我们就动手创建或修改一下就可以了

  由于绑定下拉列表函数我们的模板没有生成,所以就手动创建一下

  同理,我们按InformationClassBll逻辑类的内容,创建AdvertisingPositionBll逻辑类

  View Code

 

  接口函数与数据加载函数在前面的章节已经讲述过了,这里就不再重复说明

 

  列表属性绑定,一般指的是页面中列表的列控件、点击事件、翻页事件、排序事件......等各种列表控件事件的绑定,对于翻页与排序事件,我们在父类中已经实现了,所以不用再进行处理,而这里我们要做的功能是,点击列表中的状态项进行更新,比如当前记录的状态是允许该记录显示出来,那么点击后就自动更改为隐藏状态。

  对于这里,我们按下面代码修改一下

  View Code

  对于AdvertisingPositionBll.GetInstence().UpdateIsDisplay()函数的调用,如果没有细心留意前面章节的朋友,可能会比较奇怪怎么有这个函数,这是因为我们在设计数据库时,所有状态类的字段都会设置为tinyint类型,当逻辑层代码生成模板检测到字段类型为tinyint时,就会生成一个更新状态的函数提供给我们调用,这样我们就无需去编写这些常用的函数了,直接拿来使用即可。

  比较一下这里列表属性绑定后的效果

 

  对于记录删除函数,一般在删除前我们都必须判断一下,看看该记录是否已给其他表引用了,是的话则不能直接删除(因为直接删掉的话有可能会引起其他表使用时的异常或数据同步查询等问题),另外如果存在图片的也必须先删掉图片,当然图片删除函数我们的逻辑层模板也生成好了,直接引用就可以了。这些都处理好才直接执行记录删除函数删除记录。

  由于我们的广告表未创建,所以这里我们先将广告位置是否给广告表引表的检查注释掉。

 

  View Code

   这里还有个地方要同大家讲一讲,对于页面列表,我们选中了一列、或多列时,怎么取得选中列的主键Id呢?这里我们可以调用下面三个函数来获取:GridViewHelper.GetSelectedKey()——用于获取选中单条的记录Id、GridViewHelper.GetSelectedKeyArray()——用于获取多记录时的Id数组、GridViewHelper.GetSelectedKeyAll()——用于获取单选项中,设置了多个绑定字段时,返回这多个字段值的数组。

  对于最后这个,我们有时候需要选中项传回多个字段值时,可以在表格Grid设置属性DataKeyNames="Id, Name, Keyword",那么使用GridViewHelper.GetSelectedKeyAll()就可以获取当前选中记录的这三个字段值。

 

  做到这一步,代码的修改已经算是完成了,我们执行一下编译,看看有没有通过,如果没有再检查一下原因。

  这样做完后,我们登陆后端管理系统,并没有发现菜单中存在广告链接,所以接下来我们要将已完成的广告注册到后端管理系统中。

 

  我们登陆后端管理系统,进入系统管理=》权限管理=》菜单管理,点击新增按钮

  为了方便菜单的管理,我们先创建广告管理菜单,如下图,填写菜单名称为广告管理;节点不用选择;填入广告所在的文件夹路径;排序号我们可以选填写2,将广告管理放到信息管理项(该项排序值为1)的后面,如果填写0的话,将自动生成同级别最大的排序值,放到最后面;是否菜单或页面那里,选择菜单(在后面绑定页面控件时,菜单是不能绑定页面控件的,只有页面才能绑定);是否显示这里当然是选择在菜单栏中显示出来。填好后点击保存生成广告管理菜单。

   然后我们添加广告位置管理菜单

  填写完以后,我们刷新页面发现广告管理并没有在菜单栏显示出来,这是因为我们还没有为当前帐号绑定权限

  在我们绑定权限前,先要为页面绑定控件

  我们打开系统管理=》权限管理=》页面权限设置,点击左栏的广告位置管理,将添加、编辑、删除、自动排序、保存排序这几个控件选择后点击中间的>>按钮,将它们绑定好该页面

 

   然后点击职位管理,找到当前管理所在的部门与职位——技术部--软件开发工程师

  点击编辑可以看到下图内容,我们点击广告管理就可以将所有管理项权限都赋给该职位了

 

  然后点击顶部的,退出系统重新登陆后,就可以在菜单栏上查看到广告位置管理链接了

 

 

 

 

  如果对添加、编辑、删除等按钮权限没有打勾或没有在页面控件中绑定的话,就会出现下图情况,程序默认该用户对这些按钮没有操作权限,打开页面后页面将会自动将这些按钮禁用

 

 

 

   接着我们添加广告编辑页面

  同样复制InformationClassEdit.aspx文件并改名为AdvertisingPositionEdit.aspx

  

  同样做上面的替换操作

  然后打开AdvertisingPositionEdit.aspx文件,编辑显示的控件

  View Code

  对于编辑页面对应的cs文件,如果页面比较简单的话,我们一般要做的处理就是对对aspx页面的控件进行赋值操作,还有就是存储处理。

  对于AdvertisingPositionEdit.aspx.cs文件,同样我们也是先在加载数据函数中,对页面控件进行赋值操作。

  通过逻辑层的GetModelForCache()函数来读取记录实体(这里要注意的是,如果数据表的记录可能会比较多的时候,我们就不要使用数据缓存功能,这样会加大服务器的负担,我们直接使用GetModel(id, false)函数直接从数据库中读取实体),然后对页面控件逐个赋值。对于下拉列表的绑定,编辑时不建议开启修改,因为修改时编辑人员可能会更改当前节点到其他级别的父类,这样操作需要在保存函数里做相当多的判断处理,增大开发的工作量。

 

  View Code

 

 

 

 

  添加删除图片按钮函数,从下列代码中可以看到,删除函数都是调用模板生成的

  View Code

 

  进入保存操作时,一般我们要先对输入的数据进行检查,检查必填项是否为空,检查指定项在数据库中是否存在重复项等内容,然后获取或创建编辑实体,跟着检查相关项是否有修改,有的话保存成功后需要同步修改其他关联表对应的字段,接着是读取页面控件值对实体进行赋值操作,如果有图片上传的,则调用上传方法上传图片,再然后就是保存实体,同步更新关联表字段。

  首先检查检查必填项是否为空,检查指定项在数据库中是否存在重复项等内容

  View Code

  在开发时要注意的是,使用lambda表达式传递条件时,必须先计算出值后,将存储值的变量放到lambda表达式中比较,而不能将计算的表达式作为值放在lambda表达式中比较,这样会出错的。

 

  对相关项进行检查完毕后,跟着就是进行赋值操作,获取页面控件值进行SQL注入过滤或XSS过滤后,将值赋给实体。

  对于页面控件值的获取,字符串类型一般都会使用StringHelper.Left(页面控件, 截取长度)函数来获取,让输入到数据库的字段值自动去掉两旁空格,并进行XSS过滤后,截取数据表字段规定的大小后存储过来,避免相关人员录入过长数据,而对于需要录入特殊符号的字段,可以使用StringHelper.Left(页面控件, 截取长度, true, false)函数来获取,这样就只进行SQL注入过滤,而不进行XSS过滤,具体请大家查看该函数,里面有详细注释。而对于数值型的则使用相关函数进行转换。

 

  View Code

 

 

 

 

  如果页面需要上传图片的,则必须先在系统管理=》基础设置=》上传配置管理中,添加一项新的配置,取得新建的配置Id后,再使用图片上传方法来上传图片。具体上传类的使用我会在后面的章节单独讲解。

   代码中绑定好对应的Id

 

 

 

  最后是将实体保存到数据库,以及同步更新关联表字段,由于广告表未创建,所以暂时注释掉代码。

 

  接下来要做的还是菜单注册与权限绑定操作,这里就不再继续重复了。

 

  最终编辑页面实现效果:

 

 

  上面内容看起来好像非常多很复杂的样子,实际上只要你做过几个例子,然后熟悉本框架的开发模式后就会感觉简单多了,整个操作来看,编码部分相对来说比较少,且绝大部分都是调用已生成好的模板函数,也就是说只要你熟悉了模板函数,想实现什么样的功能都不是很难,同时也不用自己编写大量的逻辑层以及数据层代码,一键生成。想轻松的使用本框架开发新功能,必须学会FineUI插件的相关调用,FineUI官方有在线示例,都比较简单。其实只要你将FineUI的控件属性,在页面中直接修改后刷新页面,查看其变化,逐个测试过后你就基本上掌握了,非常简单,我也是这样学习的。

  整个操作所花费的时间更多是用在数据库表单的设计、UI的绘制,以及页面开发完成后在后端权限模块进行注册绑定。

  使用本框架开发,更多的是让开发人员从复制粘贴工作中解放出来,不用编写大量的底层重复函数,更多的关注UI的制作以及业务逻辑设计。因为底层模块会将日志、安全检查、常用函数.....等功能已经帮我们实现了。

 








    本文转自 AllEmpty 博客园博客,原文链接:http://www.cnblogs.com/EmptyFS/p/3830020.html,如需转载请自行联系原作者


相关文章
|
8天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
3月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
7月前
|
编译器 C#
C#之十七 局部类型
C#之十七 局部类型
17 0
|
1月前
|
存储 C# 开发者
C#变量类型
C#变量类型
17 0
|
2月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报
|
3月前
|
开发框架 .NET 编译器
C# 9.0中的目标类型新表达式:类型推断的又一进步
【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。
|
3月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
37 2
|
3月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。
|
8月前
|
开发框架 .NET C#
C#/.NET/.NET Core优秀项目和框架精选(坑已挖,欢迎大家踊跃提交PR或者Issues中留言)
C#/.NET/.NET Core优秀项目和框架精选(坑已挖,欢迎大家踊跃提交PR或者Issues中留言)
142 1
|
3月前
|
数据采集 开发框架 JavaScript
C#/.NET/.NET Core优秀项目和框架2023年12月简报
C#/.NET/.NET Core优秀项目和框架2023年12月简报