ASP.NET开源框架之HIPPO技术内幕(五)--控件结构

简介:

五、控件结构

    上一章讲的是如何实现多语言的设计,本章来讲一下控件部分。

    不管后端的代码多么完善,多么完美,最后都要以一定的形式展示出来,并且要使用灵活,这时就会用到控件。

    在ASP的年代,去写这种控件基本上是一件很痛苦的事情,现在简单多了,在asp.net技术中,有两种写控件的方式,一种是WEB用户控件,这种方式可以采用可视化编程方式,但是使用非常不灵活,并且不能编译成DLL文件,不能拥有自己的参数,完全要靠页面get/post过来的参数,不适合复杂的场景。另一种方式是写用户自定义组件,这种方式没有可视化编程,完全要靠手写代码,但是它的优点很多,比如可以生成DLL,可以加载到左侧工具栏供调用,可以设置参数及属性等,在我的程序中,后端管理程序全是用的后者。

    我用的大部分控件由http://www.infragistics.com/ 的控件继承得来。最主要的一个控件是继承自它的UltraWebGrid控件,这个控件比微软自带的Grid控件要好很多,拥有WinForm的效果,本系统对它进行继承的作用是加入对MetaData的支持,并取名作:DBGridPro。在这个类中,有一个函数名为:MakeStructure,是对GRID进行初始化,根据构造函数中指明的ContentType,去数据库中取出这个类型所对应的所有的Attribute(字段),然后填充到DBGridPro的表头中,在Attribute中,规定了字段用于显示的名字,还有显示宽度等,在这里都得到了一一的体现,如果字段规定为只读,那么在表格中也会做相应的只读处理,如果是隐藏,那么在GRID中也会设为不可见,这样,我的DBGridPro就把该ContentType做了一个原样的重现。

    Grid控件除了展示数据外,还有个很重要的功能就是实现对数据的更新,在传统的HTML+ASP的操作中,对数据的更新一般很难有CS的效果,都是写几个文本框,加一个提交按钮来实现,现在有这个控件就方便多了,只要在GRID中双击一下,就实现对数据的编辑,当然这完全得益于我所继承的控件的原始功能,然后只要鼠标点中当前行以外的任何地方,都会实现对当行数据的修改,这个功能是我重载了UpdateRow这个事件,加入我的代码来实现的。这些代码完全封装起来了,在写程序调用此控件的时候,完全不需要理会,只要给它指定了一个ContentType即可。因为这部分代码量比较大,所以在此不再粘贴。

    还一个比较有特色的控件,叫做“字典”控件,在OracleEBS中也叫做种子数据,比如性别分为男和女,学历包括小学、中学、大学等几种,把所有这些内容全部组织在两张表中,一个是ZR_DICT_CATEGORY,存储字典的名字,如“性别”、“学历”,第二张表是ZR_DICT,存储字典的明细,如“男”,“女”,“小学”等,在使用的时候,会给字典控件指定一个字典的名称,如 dict.DictName = “GENDER”,这样,在实际运行时候,就会在字典控件中列出“男”和“女”两项,很方便,如果在数据库中对字典的内容进行了扩充,在控件中就会自动得到体现,而且不需要写任何的SQL代码。

    对于以上的情况,所需要的字典的内容全部来自于同一张表,在有些情况下,并不是很方便,比如需要选择“用户类型”,可能有专门的表存储它,因为在字典中存储的信息是有限的,这时就不能很好的利用字典控件了,为了解决这个问题,有一个专门的控件叫做“值集”控件,这也是从OracleEBS中学习得来。与字典控件相比,这个控件在寻找数据源的时候,会根据存储的一个SQL语句来寻找,如:select user_type_id,user_type from zr_user_type,并用用户类型ID及名称来填充相应的控件。

    以上两个控件都使得在使用本系统的时候,可以做非常灵活的应用。

    现在继续说上面的GRID控件,为了对它实现更多的扩展和灵活性,写了一个页面,叫做content_invoke.aspx,里面放置了一个GRID控件,页面接收参数来指明是哪个ContentType,然后在page_load方法中实现数据的抓取。

    在WinForm的程序中,GRID控件都有很丰富的筛选功能,用起来也很方便,只要在相应的列上点选一下,就像Excel那样,可以直接选择需要哪些数据,但是在IE中,好像无法做成这个效果,所以针对记录的筛选,不同的系统也有不同的做法,一般的做法是做很多的文本框,用于不同的条件输入,或者搞一个下拉列表输入不同的条件,但是一般很难做到复杂条件的组合。我做的这个Filter控件,也是与Content绑定,他会把ContentType所有的属性读出来,作为筛选的条件,并且会检查它的字段类型,来决定用于输入值的地方该用什么控件来接收,如日期型或数值型等,对于一个字段,可以有两个条件,中间可以用And或者Or来做连接,这样“拼装”起来后,就会形成一个复杂的SQL条件,把它附加在查询语句的最后,就可以实现按条件来查询了。这个控件与DBGridPro一起,放在content_invoke.aspx页面中一起使用。

    在“Meta-Data驱动”一章中,我们曾经提到了“子表”的概念,这个也是在content_invoke.aspx中得到了体现,程序把这个页面分成上下两部分,上面用于显示ContentType的主体内容,所有子表全放在下面部分显示,如果有多个子表,会放在不同的Tab中来显示,每个子表部分,其实也是放了一个DBGridPro来显示,最后拼装起来就出现了一对多的关系,这种关系特别适于描述订单中的订单头与订单行的关系。一般来说,每张订单都会对应着若干的订单行,还可以对应付款明细,发货明细等信息。

    在WinForm程序中,可以分为两类,一个是SDI模式,另一个是MDI模式,SDI叫做单窗体,MDI叫做多窗体,SDI的典型应用是记事本,打开一个文件后,前面的文件就没有了,而MDI的典型应用是WORD,可以同时打开多个文件进行编辑,互不影响。

    在HTML中,连接一般有两种方式,一种是直接替换上一个页面的内容,第二种就是在新窗口中打开,可以理解为对应着CS程序中的SDI和MDI,但是想在同一个IE窗口中打开几个页面是比较困难的,我为了这个功能也是费了很大的力气,最后还是在一些基础控件的基础上做了扩展,实现了真正的MDI的效果,这种效果可以在yahoo邮箱中找到样式。

    控件要想有比较好的体现,必须依赖于后台有一个好的数据结构,正是在Meta-Data的驱动模式下,使得这些控件在使用的时候能够得心应用,形成了一个扩展性良好的后台管理部分。下一章就来讲一下如何使用后台及对后台管理部分进行扩展。


本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2010/04/17/1714231.html,如需转载请自行联系原作者

相关文章
|
9天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
9天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
9天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
9天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
9天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
9天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
9天前
|
人工智能 前端开发 Cloud Native
【专栏】洞察.NET 技术的开发趋势
【4月更文挑战第29天】本文探讨了.NET技术的三大发展趋势:1) 跨平台与云原生技术融合,通过.NET Core支持轻量级、高性能应用,适应云计算和微服务;2) 人工智能与机器学习的集成,如ML.NET框架,使开发者能用C#构建AI模型;3) 引入现代化前端开发技术,如Blazor,实现前后端一致性。随着.NET 8等新版本的发布,期待更多创新技术如量子计算、AR/VR的融合,.NET将持续推动软件开发的创新与进步。
|
9天前
|
人工智能 前端开发 Devops
【专栏】洞察.NET 技术在现代开发中的作用
【4月更文挑战第29天】本文探讨了.NET技术在现代软件开发中的核心价值、应用及挑战。.NET提供语言统一性与多样性,强大的Visual Studio工具,丰富的类库,跨平台能力及活跃的开发者社区。实际应用包括企业级应用、Web、移动、云服务和游戏开发。未来面临性能优化、容器化、AI集成等挑战,需持续创新。开发者应深入理解.NET,把握技术趋势,参与社区,共创美好未来。
|
9天前
|
开发工具 C# 开发者
【专栏】理解.NET 技术,开创美好未来
【4月更文挑战第29天】本文探讨了.NET技术在软件开发中的关键作用,强调其核心优势,如语言多样性、丰富类库、强大的开发工具和跨平台能力。.NET在现代应用开发中涉及企业级应用、云服务集成、微服务、移动应用和游戏开发。未来,.NET将持续创新,提升性能,拓展应用场景,并促进更紧密的社区合作,通过跨平台框架扩大应用范围。开发者应深入学习.NET,抓住技术趋势,共创美好未来。
|
9天前
|
机器学习/深度学习 人工智能 开发者
【专栏】.NET 技术:为开发带来新机遇
【4月更文挑战第29天】本文探讨了.NET技术如何为软件开发带来新机遇,分为三个部分:首先,.NET的跨平台革命,包括.NET Core的兴起、Xamarin与.NET MAUI的移动应用开发、开源社区的推动及性能优化;其次,介绍了云服务与微服务架构的集成,如Azure云服务、微服务支持、DevOps与CI/CD,以及Docker容器化;最后,讨论了AI与机器学习集成,如ML.NET、认知服务、TensorFlow和ONNX,使开发者能构建智能应用。面对这些机遇,开发者应不断学习和适应新技术,以创造更多价值。

相关实验场景

更多