operamasks-ui2.0 +MVC4.0+EF5.0实战之一 开篇及布局控件介绍

       两年前,曾打算自己开发一个web开发框架,把部门、人员、权限、日志作为基本服务加入进去,在其基础上可以做业务快速开发,结果没有坚持下去,仅仅开了个头就夭折了。究其原因,一方面是采用自己完全不熟悉的新技术,不算成熟的MVC,对习惯于WEB FORM开发的我,是一个比较大的冲击,加上EntityFramework涌入的大量概念,对JQuery的一知半解,以及这三项技术自身不成熟带来的BUG和版本的不断升级变更,都带来了很大困扰。两年之后,重启开发框架之旅。

   开发工具选择VS2012,后台使用MVC4.0+EntityFramework5,前台选用operamasks-ui2.0 +JQuery1.6.3(Jquery用此版本是跟operamasks-ui2.0匹配,担心冒然换成新的出来一些莫名其妙的问题)。 

      关于前台框架的选择,需要多说两句。

  两年前,曾经使用过JQuery,当时没有成套的JQuery控件,往往是根据需要逐个搜寻,例如布局、tree、Tab、datagrid等等,最大的问题就是没有统一的风格和界面,缺少文档和示例,以及网上各种对源码进行任意修改和扩展的版本,需要自己花大量时间摸索和试验,当时就觉得这种混乱的局面终会结束,出现一个统一的框架。

  现在来看,类似的框架涌现出来很多,开始没有认真筛选对比,大概搜了下,看不少人推荐easyUI,说其免费开源,然后看了下官方网站,网站上提供了丰富的文档和demo,风格(包括界面风格和编程风格)统一,因此在自己的开发框架中使用了easyUI,用了layout、tree、tab、datagrid等,完成了业务实体增删改查,感觉还不错,小问题确实有,比如页面加载时元素抖动、DataGrid列表界面搜索文本框里加回车事件却被分页控件里的页码框截获,还有一个就是没有控件刷新方法,比如刷新树,新增了数据后刷新datagrid,得自己写一个刷新,虽然往往只有一句话,但还是不如直接提供一个方法调用方便……总体来说,用起来还是挺方便。

  本想开一个系列,记录下开发过程中的点点滴滴,与大家交流,刚发了第一篇, EasyUI1.3.1+MVC4.0+EF5.0实战之一 开篇及布局控件介绍,有园友回复说easyui商用需要付费,于是反过头来认真读了下官方的说明,449刀,非年费,不限项目和时间,说实话,这价格还说得过去。

  有了这段插曲,于是找其他同类框架来大体比较了下,纠结了下要不要用免费开源的替换掉easyui。

     园友的回复集中在LigerUI和DMZ,从搜索引擎来看,ligerui 网上的评价貌似不怎么样,说个人弄的,有bug也不修复,至于dwz,网上没评价,倒是挂了几个后台是java和php的应用案例,貌似还可以。结果自己看了一下二者官方网站,反而觉得DMZ官方页面乱,控件展现效果比较粗糙,demo和文档条理性差,反而是ligerui看上去比较精致。 

  后来有园友提到了operamasks-ui,LGPL协议,看了下官网和团队,应该是金蝶旗下产品,感觉相当不错,网上也有不少行业网站的访谈和同类产品性能评测。

  另外,下面这篇园子里的文章是比较全面的列举和简介前台应用框架,推荐阅读一下:前端框架你究竟选什么

  于是,最终决定尝试一下,使用operamasks-ui替换掉easyUI,同样将开发过程中的点点滴滴记录下来。

  官方网站:http://ui.operamasks.org/website/homepage.html 怎么下载和加入项目我就不多说了,参考官网说明即可。 

      上面说了啰嗦了这么多,下面转入正题,来说一下最常见的布局。

  对于MIS管理系统,常见的布局分为三大块,顶部是系统名称,加当前登录人的账号、姓名、部门等信息展现,以及注销、切换账号等操作按钮;左侧是系统菜单栏,右侧是主工作区,点击左侧菜单,可以在主工作区显示对应的业务处理界面。为了最大程度利用空间,通常还要求左侧导航菜单栏可以折叠隐藏显示。 先上效果图,有个直观的印象:

   

  之前的开发,通常就是使用Html的frameset标签  

<frameset cols="25%,50%,25%">
 
  <frame src="frame_a.htm" />
 
  <frame src="frame_b.htm" />
 
  <frame src="frame_c.htm" />
 
</frameset>

  然后在自己编写JS来控制折叠和隐藏某个区域。 

  使用operamasks-ui(好长的名字,以下简称om)就简单多了,首先将下载的压缩包解压加入到工程中,我选择放在web工程根目录下,与视图文件夹View同级存放,名字为“OperaMasksUI”,然后修改Home控制器对应的Index视图:

  1.在head标签内部加入对om相关css样式表的引用

       @Styles.Render("~/OperaMasksUI/css/default/om-default.css")

  2.在</body>标签之前加入以下对js文件的引用

      @Scripts.Render("~/OperaMasksUI/js/jquery163.min.js")

    @Scripts.Render("~/OperaMasksUI/js/operamasks-ui200.min.js") 

  注:其实上面的Styles.Render 和Scripts.Render真正用途是将多个css和js压缩和传输,后文再找个机会详细说这块。这里我是参照默认模板下写的,误打误撞也能运行,可以解析成正确的引用。

      参考官方说明和demo,在body里加入以下内容

    

  <div id="page" >

        <div id="north-panel" />      

        <div id="center-panel"  style="padding: 0 10px;" />

        <div id="east-panel" />

        <div id="west-panel" />

        <div id="south-panel" style="vertical-align:top; text-align:center" >

            &copy; @DateTime.Now.Year - 版权声明

        </div>

</div>  

然后,写js来初始化

     

 $(function ()

        {

            //初始加载

            loadLayout();         

        });

        //加载布局

        function loadLayout()

        {

            $('#page').omBorderLayout({

                panels: [{

                    id: "north-panel",

                    region: "north",

                    resizable: true,

                    collapsible: true,

                    height: 100,

                    header:false

                },

                {

                    id: "center-panel",

                    region: "center",

                    header: false

                },

                {

                    id: "west-panel",

                    title: "功能菜单",

                    region: "west",

                    resizable: true,

                    collapsible: true,

                    width: 200

                },

                {

                    id: "south-panel",

                    region: "south",

                    resizable: true,

                    collapsible: true,

                    height: 20,

                    header: false

                }              

                ],

                hideCollapsBtn: true,

                spacing: 7

            });

        }

与easyui有点区别,Easyui支持两种方式,一种与上类似,通过js来初始化,另一种可以通过html标签扩展属性来初始化,不用写js代码

<body class="easyui-layout">
 
    <div region="north" title="" split="true" style="height: 100px;"></div>
  ……

</body>

  前面夸了一下om简单易用,用其替代easyui的时候就栽了……

  由于是在原来已经做好的ui上改的,所以我操作完上述步骤后,就以为大功告成了,结果运行……js报错,提示,对象不支持“css”属性或方法,jquery肯定有css方法的,把jquery1.8.0替换成随om2.0自带的1.6.3问题依旧,表面上看不出什么问题,后来逐行排查,发现问题出在<div>标签的闭包上……

  <div id="north-panel" />   改为<div id="north-panel"></div>就正常了

  这算BUG吗?好吧,这算个注意事项。  

  这还没完,解决了js报错,出来的是个白屏,怀疑是没加高度和宽度,给最外层id为page的div加上了高宽,确实能显示了,但是,我想要全屏效果,给div高和宽指定100%,还是白屏,于是又补了下基础知识,需要给html和body加宽度和高度,不然div子元素设置的百分比无效,后来看到了官方demo自适应窗口大小,有了详细的解释:
  页面加了DOCTYPE声明后body和html默认是没有高度的。因此如果要自适应body大小需要给html和body加上100%的高度。另外,浏览器会默认给html和body加上页边距,所以还要设置html和body的padding和margin为0

  解决方式如下: 

  <style>

        html, body {

            width: 100%;

            height: 100%;

            padding: 0;

            margin:0;

            overflow: hidden;

        }

</style>

  加上后,还是白屏……查看示例,没发现什么异常,然后推测是填充原因,找了下属性,把自动填充父元素的fit属性设为true(默认为false)总算正常了,说实话,这个属性默认为true更合理。官方demo显示正常,是因为为每个区域设定了具体的高度和宽度。

   好多坑啊好多坑……

 还有点不够完美的地方就是左右边框基本看不见了,有点缺失的感觉,还算可以忍受。 

 可以设定上下左右中五个区域,这里没有使用右侧区域,底部区域也仅仅放了一个版权声明, 顶部是系统名称,加当前登录人的账号、姓名、部门等信息展现,以及注销、切换账号等操作按钮,左侧为系统功能菜单导航树,点击叶节点后将在中心区域打开对应的业务功能页面。

 与easyui只能左右折叠相比,om可以往四个方向折叠,而且提供了仅占用很小空间的小箭头方式,更加优美。

 比如我想允许左侧菜单导航区域折叠,禁止顶部区域折叠,设置hideCollapsBtn为true,设置north-panel的collapsible属性为false,搞定。

 本文从实战角度出发,加入自己多年来的开发经验和项目经验,仅指明关键属性和要注意的事项,其他属性请查阅官方网站说明。 

 第一次做开发平台,有些问题也在摸索和思考,欢迎同行讨论拍砖,共同进步。

posted on 2013-01-31 16:16  大浪淘沙  阅读(6971)  评论(11编辑  收藏  举报

导航