基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作


 

在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调。但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这样给我们扩展使用有很多的不方便。基于这个原因,我想如果能够独立一个模块,自动根据图标生成图标CSS样式文件,并存储相应的记录到数据库里面,方便我们查询显示,那样我们使用起来就很方便了,最后有了这些数据,只需要做一个通用的图标选择界面,并可以在很多地方重用了。本文正是基于这个思路,开发了一个图标管理模块和图标选择界面,本文主要阐述这个开发过程和最终的效果展示。

1、图标样式生成管理

为了方便根据读取的图标文件列表,生成对应的图标样式文件,我们可以利用NVelocity组件,基于模板进行CSS样式文件的生成。关于NVelocity的使用,可以参考我多篇关于它的介绍,这个组件非常强大,我自己的代码生成工具也是基于它编写了很多模板进行代码生成,具体可以参考一下《使用NVelocity生成内容的几种方式》这篇文章。

1.1 图标样式文件准备

有了这些准备,我们可以定义一个模板的文件用来生成样式文件了,我们先看最终的样式文件效果。

复制代码
.icon-table{
    background:url('table.png') no-repeat center center;
}
.icon-telephone{
    background:url('telephone.png') no-repeat center center;
}
.icon-user{
    background:url('user.png') no-repeat center center;
}
.icon-view{
    background:url('view.png') no-repeat center center;
}
.icon-word{
    background:url('word.png') no-repeat center center;
}
 
复制代码

根据以上组织效果,我们可以定义一个模板内容如下所示。

#foreach($item in ${FileNameList})
.${item.Text}{
    background:url('${item.Value}') no-repeat center center;
}
#end ##endforeach

其中FileNameList变量是一个基于名称和值的集合对象,我们遍历它进行生成就可以了。

1.2 图标样式的生成操作

有了模板,我们还需要组织好对应的文件目录,一般来说,Web的图标可以使用16,24,32这些标准大小的图表,适应不同场合的需要。

因此我们创建几个不同的目录,并放入对应的模板文件和图标文件。

生成图标样式文件的操作分为下面几个步骤:

获取对应目录的图标文件,转换为实际的对象格式集合,生成图标样式文件,存储图表样式到数据库方便查询。

这些操作我们在图标管理的控制器 IconController 里面增加方法完成,部分代码如下所示。

复制代码
        /// <summary>
        /// 生成图标文件
        /// </summary>
        /// <param name="iconSize">图表尺寸,可选16,32等</param>
        /// <returns></returns>
        public ActionResult GenerateIconCSS(int iconSize = 16)
        {
            CommonResult result = new CommonResult();

            string realPath = Server.MapPath("~/Content/icons-customed/" + iconSize);
            if (Directory.Exists(realPath))
            {
                List<CListItem> list = GetImageToList(realPath, iconSize);

                try
                {
                    //使用相对路径进行构造处理
                    string template = string.Format("Content/icons-customed/{0}/icon.css.vm", iconSize);
                    NVelocityHelper helper = new NVelocityHelper(template);
                    helper.AddKeyValue("FileNameList", list);

                    helper.FileNameOfOutput = "icon";
                    helper.FileExtension = ".css";
                    helper.DirectoryOfOutput = realPath;//指定实际路径

                    string outputFilePath = helper.ExecuteFile();
                    if (!string.IsNullOrEmpty(outputFilePath))
                    {
                        result.Success = true;

                        //写入数据库
                        bool write = BLLFactory<Icon>.Instance.BatchAddIcon(list, iconSize);
                    }
                }
                catch (Exception ex)
                {
                    LogTextHelper.Error(ex);
                    result.ErrorMessage = ex.Message;
                }
            }
            else
            {
                result.ErrorMessage = "没有找到图片文件";
            }

            return ToJsonContent(result);
        }
复制代码

上面的方法很好的完成了对图标样式的生成和保存数据库的操作,这个生成操作主要就是基于模板化的生成,非常方便。

在构建名称值的集合的时候,注意图标样式名称,不能包含有 一些特殊的字符,如[]()这些符号需要去掉,因此可以通过下面的正则表达式替换方法进行去除。

                    string displayText = Path.GetFileNameWithoutExtension(file);
                    //文件名需要去除()和[]等符号
                    displayText = CRegex.Replace(displayText, @"[)\];,\t\r ]|[\n]", "", 0);
                    displayText = CRegex.Replace(displayText, @"[(\[]", "-", 0);

最终,我们可以构建一个独立的页面,用来实现生成图标样式并保存的操作,界面如下所示。

界面操作代码如下所示。

复制代码
            //绑定按钮的的点击事件
            function BindEvent() {                
                $("#btnGenerateCSS").click(function () {
                    $.messager.confirm("操作确认", "您确认重新生成图标记录吗?", function (action) {
                        if (action) {
                            //图表尺寸
                            var iconSize = $("#IconSize").combobox('getValue');
                            //alert(iconSize);
                            var postData = "";

                            $.ajax({
                                type: 'POST',
                                url: '/Icon/GenerateIconCSS?iconSize=' + iconSize,
                                dataType: 'json',
                                data: postData,
                                success: function (data) {
                                    if (data.Success) {
                                        showTips("操作成功");
                                        location.reload();
                                    }
                                    else {
                                        showError("操作失败:" + data.ErrorMessage, 3000);
                                    }
                                }
                            });
                        }
                    });
                });
            }
复制代码

  

2、图标的分页展示

为了有效查看我们生成在数据库的图标列表,我们需要一个合理的界面表现方式,用来显示图标信息。传统的使用datagrid的方式比较呆板,也不是很方便,所以我们需要自定义分页处理进行展现,基于重用一些优秀组件的原则,我侧重于使用一些现成的组件模块,MVC分页方面,考虑使用杨涛的MVC分页控件(http://www.webdiyer.com/mvcpager/),这个功能看起来很不错。

图表的展现方式,我希望通过easyui的这个例子进行展现一组图表的效果。

2.1 图表展现的界面效果

然后系统通过把它们进行分页处理,选择一些好的分页样式表现方式

最终实现的图表样式显示效果如下所示。

小图标效果如下所示。

大图标效果如下所示。

 

2.2 图标的分页处理操作

杨涛的分页控件,提供了很多绑定分页的方式,不过都主要是基于MVC的模型数据处理,在我的Web框架里面主要利用JS绑定数据,有 一定的差异,但是既然大家都是MVC应用,整合还是没问题的。

为了展现上面的效果,我们需要建立一个表单查询的内容,代码如下所示。

复制代码
            <fieldset>
                <legend>功能操作</legend>
                @using (Html.BeginForm("select", "Icon", new RouteValueDictionary { { "id", "" } }, FormMethod.Get))
                {
                    <span>尺寸:</span>
                    <select class="easyui-combobox" id="IconSize" name="IconSize" style="width:100px">
                        <option value="16">16×16</option>
                        <option value="24">24×24</option>
                        <option value="32">32×32</option>
                    </select>
                    <input type="submit" value="搜索(S)" accesskey="S" />
                }
            </fieldset>      
复制代码

数据内容的展现,主要就是利用了easyUI的样式,创建一些linkbutton的代码,代码如下所示。这里注意的是,我也是用了model,它是PagedList<WHC.MVCWebMis.Entity.IconInfo>类型的。

也就是说,最终这个视图界面后台,是有一个模型的绑定的。

复制代码
        <div id="contents">
            @using Webdiyer.WebControls.Mvc;
            @model  PagedList<WHC.MVCWebMis.Entity.IconInfo>
            @foreach (var item in Model)
            {
                <a href="javascript:void(0)" class="easyui-linkbutton" onclick="SelectItem(this, '@item.IconCls')" id="@item.ID" data-options="plain:true,iconCls:'@item.IconCls',size:'large',toggle:true"> </a>
            }
        </div>
复制代码

图标后台处理的控制器方法如下所示。

复制代码
        /// <summary>
        /// 根据条件获取基于PagedList的对象集合,并返回给分页视图使用
        /// </summary>
        /// <param name="id">分页页码</param>
        /// <param name="iconsize">图标尺寸</param>
        /// <returns></returns>
        private PagedList<IconInfo> GetPageList(int? id, int? iconsize = 16)
        {
            int size = iconsize ?? 16;
            int pageIndex = id ?? 1;
            int pageSize = 200;

            PagerInfo pagerInfo = new PagerInfo();
            pagerInfo.CurrenetPageIndex = pageIndex;
            pagerInfo.PageSize = pageSize;

            string where = string.Format("iconsize = {0}", size);
            List<IconInfo> list = BLLFactory<Icon>.Instance.FindWithPager(where, pagerInfo);
            PagedList<IconInfo> pageList = pageList = new PagedList<IconInfo>(list, pageIndex, pageSize, pagerInfo.RecordCount);
            return pageList;
        }

        /// <summary>
        /// 根据条件获取分页数据集合,并绑定到视图里面
        /// </summary>
        /// <param name="id">分页页码</param>
        /// <param name="iconsize">图标尺寸</param>
        /// <returns></returns>
        public ActionResult Select(int? id = 1, int? iconsize = 16)
        {
            PagedList<IconInfo> pageList = GetPageList(id, iconsize);
            return View("select", pageList);
        }
复制代码

最后部分是分页部分的展现了,就是在底部展现各页的页码等信息了。

这个部分很简单,代码如下所示。

        <div>
            <div style="float:left;width:50%">
                共 @Model.TotalPageCount 页 @Model.TotalItemCount 条记录,当前为第 @Model.CurrentPageIndex 页
            </div>
            @Html.Pager(Model, new PagerOptions { PageIndexParameterName = "id" }, new { style = "float:right", id = "badoopager" })
        </div>

在分页的时候,可能很多时候,发现更新页面后,条件就消失了,这种情况是因为没有很好绑定条件的值到界面上,我们可以通过页面加载完成后,把URL里面的参数值赋值给控件就可以了。

复制代码
        $(function () {
            var iconSize = '@Request.QueryString["iconSize"]';
            if(iconSize != undefined && iconSize != "")
            {
                $("#IconSize").combobox('setValue', iconSize);
            }
        });
复制代码

这样图表大小的条件就一直可以保持正确的内容,提交表单后依旧可以正常保持了。

3、图标的选择

既然生成了图标文件,并且构建了图标的展示界面,那么我们就需要在一些需要配置图标的地方,能够提供一个界面选择图标了。

绑定弹出选择图标界面操作,在EasyUI的基础上,使用了扩展对话框的操作,可以弹出一个外部页面的选择图标菜单。

复制代码
        function SelectIcon(id, value) {
            $.showWindow({
                title: '选择图标',
                useiframe: true,
                width: 960,
                height: 640,
                content: 'url:/Icon/Select',
                data: { id: $(id), value: $(value) },
                buttons: [{
                    text: 'OK',
                    iconCls: 'icon-ok',
                    handler: 'doOK' //此方法在_content3.html中
                }, {
                    text: '取消',
                    iconCls: 'icon-cancel',
                    handler: function (win) {
                        win.close();
                    }
                }],
                onLoad: function (win, content) {
                    //window打开时调用,初始化form内容
                    if (content) {
                        content.doInit(win);
                    }
                }
            });
        }

        //绑定选择按钮的事件
        function BindSelectIconEvent() {
            $("#tdIcon").click(function () { SelectIcon("#imgIcon", "#WebIcon") });
            $("#tdIcon1").click(function () { SelectIcon("#imgIcon1", "#WebIcon1") });
        }
复制代码

选择好每个图标后,我们就会返回到主界面上,并设置好主界面上的图表样式,让它显示出我们选择的图标效果。

 

基于MVC4+EasyUI的Web开发框架的系列文章:

基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍

基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计

基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍

基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

基于MVC4+EasyUI的Web开发框架形成之旅--权限控制

基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录

基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

基于MVC4+EasyUI的Web开发框架经验总结(3)- 使用Json实体类构建菜单数据

基于MVC4+EasyUI的Web开发框架经验总结(4)--使用图表控件Highcharts

基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder

基于MVC4+EasyUI的Web开发框架经验总结(6)--在页面中应用下拉列表的处理

基于MVC4+EasyUI的Web开发框架经验总结(7)--实现省份、城市、行政区三者联动

基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

基于MVC4+EasyUI的Web开发框架经验总结(11)--使用Bundles处理简化页面代码

基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度

基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

主要研究技术:代码生成工具、Visio二次开发、客户关系管理软件、病人资料管理软件、送水管理软件等共享软件开发
专注于Winform开发框架Web开发框架、WCF开发框架、微信门户开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  
http://www.iqidi.com 
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2016-1-31 更新 1、使用时不再需要显示调用followCustomHandle方法,即可生效扩展属性。 2013-9-3 更新 1、$.showWindow 和 $.showModalDialog 在useiframe=true时,对窗体body增加遮罩控制。 2、easyui.tabs的add方法当useiframe=true时,增加遮罩控制。 3、toolbar增加url属性,可以通过请求后台数据构建。 4、增加mask(遮罩)扩展。 2013-8-26 更新 1、tree增加支持类标准数据格式加载,具体看demo或jquery.easyui.tree.extend.js文件开头说明。 2、修复datagrid在rowediting编辑风格时点击“确定”按钮无法提交问题。 3、datagrid和treegrid增加getEditingRows方法,用来获取所有正在编辑的行。 4、修复tabs.add方法,当useiframe=true时, iframe的高度改为100%。 5、修复当tabs使用iframe时,右键菜单刷新报错问题。 6、增加combotree对简单数据格式和类标准数据格式的加载,具体参考jquery.easyui.tree.extend.js文件开头说明。 7、修复datagrid.onConfirmEdit事件默认实现bug。 8、增加treegrid.onConfirmEdit事件。 2013-8-12 更新 1、修复combobox在级联操作时,传递的swd参数值为null,而不是选中值。 2、datagrid的addEventListener 方法增加对事件onExpandRow和onCollapseRow的控制。 3、tree增加自定义属性 attributes,用于简单数据加载时,指定那些字段当作node的attributes属性使用。 4、combobox增加 getSelected 方法, 返回选中item的data值。 5、combogrid增加 getSelected 方法,返回选中item的data值。 6、datagrid增加 getAllExpandRowIndex 方法,用于在detailView视图下获取当前页已展开行的索引。 7、datagrid增加 getExpandRowIndex 方法,用于在detailView视图下获取当前页第一个展开行的索引。 8、datagrid增加 fixDetailRowWidth 方法,用于detailView视图下修改rowDetial中组件宽度。 9、getAllExpandRowIndex、getExpandRowIndex、fixDetailRowWidth 这三个方法联合使用可解决detailView视图下列拖拽时显示错位问题。 10、修复datagrid 的rowEditing编辑风格在没有数据的datagrid中增加数据后,再编辑时无法显示的问题。 11、datagrid增加自定义事件 onConfirmEdit , 用于rowEditing编辑风格点击“确定”按钮时触发。当事件返回false时终止endEdit方法调用。 2013-7-31 更新 1、$.showWindow、$.showModalDialog 这两个方法增加返回值,返回值指向当前弹出窗的引用。 2、移除根据$.browser.msie判断浏览器版本。 2013-7-18 更新 1、menu、datagrid、combo、combobox、panel、tabs、tree、treegrid 增加 addEventListener 方法。 2、修复menu、datagrid、combo、combobox、panel、tabs、tree、treegrid 因事件注册造成多次重复渲染的问题(包括多次请求后台数据)。 3、移除datagrid 的rowContextMenu菜单项默认事件替换功能。 4、删除datagrid rowContextMenu默认菜单中的增加、编辑、导出菜单项。
ASP.NET MVC5是一种使用Model-View-Controller(MVC)架构设计的Web应用程序开发框架。它结合了ASP.NET技术和MVC模式的优势,可以帮助开发人员更高效地构建企业级应用程序。 EasyUI是一个开源的跨浏览器JavaScript UI框架,它为开发者提供了丰富而易于使用的界面组件和工具。EasyUI与ASP.NET MVC5结合使用,可以快速构建具备良好用户体验的企业级应用程序。 当使用ASP.NET MVC5与EasyUI进行企业应用开发时,可以充分利用ASP.NET MVC5的优势,如分离开发模式、URL路由、模型绑定等,来实现良好的应用程序架构和代码可维护性。 同时,EasyUI提供了大量丰富的UI组件,如表格、表单、对话框、树形控件等,这些组件在企业应用开发中非常常用。使用EasyUI的这些组件可以帮助开发人员快速搭建用户界面,提供友好的交互效果和丰富的功能。 在使用EasyUI的过程中,开发人员可以根据应用的需求定制化各种UI组件的样式和行为,使得应用程序更符合企业的视觉设计和用户体验要求。 此外,ASP.NET MVC5与EasyUI都是开源的框架,拥有强大的社区支持,可以通过不断积累丰富的资源来解决开发过程中的问题。 综上所述,ASP.NET MVC5与EasyUI的结合是一种优秀的企业应用开发框架,可以帮助开发人员快速构建功能丰富、用户友好的应用程序,并且具有良好的可扩展性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值