通过实例学习Fireasy开发(下篇)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 通过实例学习Fireasy开发(下篇)

通过实例学习Fireasy开发(下篇)

 2015/4/5 22:46:46  fireasy  程序员俱乐部  我要评论(0)
  • 摘要:本文目录通过实例学习Fireasy开发(上篇)通过实例学习Fireasy开发(中篇)通过实例学习Fireasy开发(下篇)通过实例学习Fireasy开发(补充)一、员工列表页面EmployeeList.aspx页面的需求是这样的,左边是部门树,右边是员工列表,点击部门节点后右边显示该部门下面的员工,同时提供岗位、生日期间查询。对table:#dg处进行改造,加下一个treegrid列表:<divdata-options="region:'center',border:false">
  • 标签:学习 开发 实例

      本文目录

      通过实例学习Fireasy开发(上篇)

      通过实例学习Fireasy开发(中篇)

      通过实例学习Fireasy开发(下篇)

      通过实例学习Fireasy开发(补充)

 

 

      一、员工列表页面

      EmployeeList.aspx页面的需求是这样的,左边是部门树,右边是员工列表,点击部门节点后右边显示该部门下面的员工,同时提供岗位、生日期间查询。

      对table:#dg处进行改造,加下一个treegrid列表:

                <div data-options="region:'center',border:false">
                    <div id="layout" class="easyui-layout" data-options="fit:true,border:false">
                        <div data-options="region:'west',border:false,split:true" style="width:220px">
                            <table id="dgDept">
                            </table>
                        </div>
                        <div data-options="region:'center',border:false">
                            <table id="dg">
                            </table>
                        </div>
                    </div>
                </div>

      然后在js里加入一个loadDepts函数,并且一开始就加载部门树:

        $(function () {
            loadDepts();
            loadData();
        })

        function loadDepts() {
            $('#dgDept').treegrid({
                url: 'DeptList.ajx/GetDepts',
                fit: true,//自动填充
                idField: 'id',
                treeField: 'text',
                columns: [[
                    { field: 'text', title: '部门', width: 180 }
                ]],
                onClickRow: function (row) {
                    $('#dg').datagrid({
                        queryParams: { deptNo: row.attributes.no }
                    });
                }
            })
        }

      修改loadData函数,把不需要的列移除掉,然后,浏览EmployeeList.aspx页面,显示如下:

      loadDepts函数里,treegrid的onClickRow事件里,datagrid将使用no作为条件筛选员工数据。修改EmployeeList.aspx.cs类中的GetEmployees方法,增加一个参数deptNo,如下:

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    //.AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

      AssertWhere是一个扩展方法,来自Fireasy.Common.Extensions,如果deptNo不为空的时候,使用Dept这个关联属性的No进行like查询,也就是说TB_EMPLOYEE join 上 TB_DEPT查询。

      EasyUIHelper的GetDataPager用于构造easyui-datagrid传递过来的两个分页参数,构造出一个分页对象pager,Linq再使用Segment扩展方法将pager传进去分页。最后,使用Transfer方法把结果转换为 { total: 10, rows: [] } 这样的json结构。

 

      增加额外的查询条件。

      我们在EmployeeList.aspx的query区加入日期和岗位查询条件。

                    <div class="query">
                        <table>
                            <tr>
                                <td>出生日期</td>
                                <td><input id="txtStartTime" class="easyui-datebox" style="width:110px" /></td>
                                <td></td>
                                <td><input id="txtEndTime" class="easyui-datebox" style="width:110px" /></td>
                                <td>岗位</td>
                                <td><input id="txtPost" class="easyui-combobox" data-options="url:'EmployeeList.ajx/GetPosts',valueField:'Value',textField:'Name',panelHeight:'auto'" style="width:110px" /></td>
                                <td>快速查询</td>
                                <td>
                                    <input id="txtKeyword" type="text" class="easyui-textbox enterQuery" data-options="prompt:'名称或拼音首字母'" style="width: 160px" /></td>
                                <td><a class="easyui-linkbutton" onclick="query()" data-options="iconCls:'icon-search'">查询</a>
                                </td>
                            </tr>
                        </table>
                    </div>

      在EmployeeList.aspx.cs里增加方法GetPosts,该方法用于获取岗位代码,岗位代码我们先用枚举来表示。

      枚举定义在WebApplicaiton1.Data的Enums.cs里。对了,还需要一个性别的枚举,这个时候一起定义好了。

    public enum PostKinds
    {
        [EnumDescription("首席执行官")]
        CEO,
        [EnumDescription("首席财务官")]
        CFO,
        [EnumDescription("首席技术官")]
        CTO,
        [EnumDescription("首席运营官")]
        COO,
        [EnumDescription("首席信息官")]
        CIO,
    }

    public enum Sex
    {
        [EnumDescription("")]
        Male,
        [EnumDescription("")]
        Female
    }

      EnumDescriptionAttribute是用于标记中文描述的特性。

      GetPosts方法就是将该中文描述和枚举值返回给前台。

        public object GetPosts()
        {
            var list = typeof(PostKinds).GetEnumList()
                .Select(s => new { Value = s.Key.ToString(), Name = s.Value })
                .ToList();
            list.Insert(0, new { Value = "", Name = "--全部--" });
            return list;
        }

      修改EmployeeList.aspx中的query函数,加入查询条件:

        //查询
        function query() {
            $('#dg').datagrid('unselectAll');
            $('#dg').datagrid({
                queryParams: {
                    startTime: $('#txtStartTime').datebox('getValue'),
                    endTime: $('#txtEndTime').datebox('getValue'),
                    post: $('#txtPost').combobox('getValue'),
                    keyword: $('#txtKeyword').val()
                }
            });
        }

      相应的在EmployeeList.aspx.cs中,修改GetEmployees方法,加入这三个参数。

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="startTime">开始日期</param>
        /// <param name="endTime">结束时间。</param>
        /// <param name="post">岗位类别。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, DateTime? startTime, DateTime? endTime, PostKinds? post, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    .AssertWhere(startTime != null, s => s.Birthday >= startTime.Value.StartOfDay())
                    .AssertWhere(endTime != null, s => s.Birthday <= endTime.Value.EndOfDay())
                    .AssertWhere(post != null, s => s.Post == post)
                    .AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

      注意,由于日期可以置空,所以参数中应使用可空类型,然后使用AssertWhere扩展方法来拼接LINQ。

      参数post使用了PostKinds枚举类型,我们需要修改一个Employee实体类型的Post属性类型由原来的int?改成PostKinds:

        /// <summary>
        /// 获取或设置职务。
        /// </summary>
        public PostKinds Post
        {
            get { return (PostKinds)GetValue(EpPost); }
            set { SetValue(EpPost, value); }
        }

      好了,员工列表页面至此就做完了。

 

      二、员工编辑页面

      打开EmployeeEdit.aspx,调整表单区域如下:

    <% var Html = new HtmlHelper<WebApplication.Data.Model.Employee>(); %>
    <div data-options="region:'center',border:false">
        <table class="form-body">
            <tr>
                <td class="addon">部门</td>
                <td><%= Html.ComboBox(s => s.DeptId).MarkDelayedSet().MarkNoClear()%></td>
            </tr>
            <tr>
                <td class="addon">编号</td>
                <td><%= Html.TextBox(s => s.No) %></td>
            </tr>
            <tr>
                <td class="addon">性别</td>
                <td><%= Html.ComboBox(s => s.Sex, typeof(WebApplication.Data.Model.Sex), new ComboBoxSettings { PanelHeight = 0 }).MarkNoClear() %></td>
            </tr>
            <tr>
                <td class="addon">姓名</td>
                <td><%= Html.TextBox(s => s.Name) %></td>
            </tr>
            <tr>
                <td class="addon">出生日期</td>
                <td><%= Html.DateBox(s => s.Birthday) %></td>
            </tr>
            <tr>
                <td class="addon">职务</td>
                <td><%= Html.ComboBox(s => s.Post, typeof(WebApplication.Data.Model.PostKinds), new ComboBoxSettings { PanelHeight = 0 }).MarkNoClear() %></td>
            </tr>
            <tr>
                <td class="addon">手机号码</td>
                <td><%= Html.TextBox(s => s.Mobile) %></td>
            </tr>
            <tr>
                <td class="addon">家庭住址</td>
                <td><%= Html.TextBox(s => s.Address) %></td>
            </tr>
            <tr>
                <td class="addon">个人说明</td>
                <td><%= Html.TextMultiBox(s => s.Description) %></td>
            </tr>
            <tr>
                <td class="addon">可用</td>
                <td><%= Html.CheckBox(s => s.State, true) %></td>
            </tr>
        </table>
    </div>

      ComboBox扩展方法可以直接绑定枚举类型。

      注意到扩展后面的两个方法了没,MarkDelayedSet标记该combobox加载完后再设置值,不然一开始可能会看到一个GUID值,这样不太友好;MarkNoClear标记该combobox的值不被清空,当点击“保存并新建”的时候,该列表框的值还保持所选择的项。

      浏览EmployeeList.aspx页面,点击添加按钮,查看一下现在的编辑页面。

      接下来,我们把部门的数据给绑定上去。

      在EmployeeEdit.aspx文件中添加一个loadDepts函数,该函数直接使用DeptList中的方法了,指定targetId,会把它所在的每一层都展开。然后在loadInfo里加入loadDepts函数:

        var deptId = '<%= Request.QueryString["deptId"] %>';
        //加载模块
        function loadDepts() {
            $('#cboDeptId').combotree({
                url: "DeptList.ajx/GetDepts?targetId=" + deptId,
                panelWidth: 260,
                onLoadSuccess: function () {
                    $('#cboDeptId').combotree('setValue', deptId);
                }
            })
        }

        //加载信息
        function loadInfo() {
            if (id != '') {
                $.getJSON('EmployeeEdit.ajx/GetEmployee?id=' + id, function (data) {
                    common.processResult(data, function () {
                        $('#form1').form('load', data);
                        deptId = data.DeptId;
                        loadDepts();
                    });
                });

                $('#btnSaveAndNew').remove();
            }
            else {
                loadDepts();
            }
        }

      新增员工时,deptId是从EmployeeList.aspx页面传过来的,看它的addInfo函数:

        //添加信息
        function addInfo() {
            var row = $('#dgDept').treegrid('getSelected');
            var deptId = row == null ? '' : row.id;
            common.showDialog('EmployeeEdit.aspx?deptId=' + deptId, '员工', 700, 450, function () {
                $('#dg').datagrid('reload');
            });
        }

      最后,只剩下保存的处理了,修改saveInfo函数:

        //保存信息
        function saveInfo(isNew) {
            if (!$('#form1').form('validate')) {
                return;
            }

            var postData = new Object();

            //将表单填充的内容序列化为json
            var data = $('#form1').form('save');
            data.DeptId = $('#cboDeptId').combotree('getValue');
            postData["info"] = JSON.stringify(data);

            common.showProcess();
            $.post('EmployeeEdit.ajx/SaveEmployee?id=' + id, postData, function (result) {
                common.processResult(result, function () {
                    if (isNew) {
                        $('#form1').form('clear');
                    }

                    id = isNew ? '' : result.data;
                    common.setReturnValue(true);
                });
            });
        }

      好,添加一个员工试试,OK,保存成功!

     点击部门树进行查询,使用日期、岗位、关键字查询,都OK!

      等等,哪里不太对劲?哦,列表中的性别和岗位还是显示数字,我们要把它变成中文!

      修改一下EmployeeList.aspx.cs中的GetEmployees方法,对返回的对象转换一下:

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="startTime">开始日期。</param>
        /// <param name="endTime">结束时间。</param>
        /// <param name="post">岗位类别。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, DateTime? startTime, DateTime? endTime, PostKinds? post, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    .AssertWhere(startTime != null, s => s.Birthday >= startTime.Value.StartOfDay())
                    .AssertWhere(endTime != null, s => s.Birthday <= endTime.Value.EndOfDay())
                    .AssertWhere(post != null, s => s.Post == post)
                    .AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .Select(s => new
                        {
                            s.Id,
                            s.No,
                            s.Name,
                            Sex = ((Sex)s.Sex).GetDescription(),
                            Post = s.Post.GetDescription(),
                            s.Birthday,
                            s.Mobile,
                            s.Address,
                            s.Description
                        })
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

      当然,也可以使用Extend方法来扩展属性,只是前台页面要改一下datagrid的field,并且注意不能用这两个属性进行排序。

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="startTime">开始日期。</param>
        /// <param name="endTime">结束时间。</param>
        /// <param name="post">岗位类别。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, DateTime? startTime, DateTime? endTime, PostKinds? post, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    .AssertWhere(startTime != null, s => s.Birthday >= startTime.Value.StartOfDay())
                    .AssertWhere(endTime != null, s => s.Birthday <= endTime.Value.EndOfDay())
                    .AssertWhere(post != null, s => s.Post == post)
                    .AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .Select(s => s.Extend(new
                        {
                            SexText = ((Sex)s.Sex).GetDescription(),
                            PostText = s.Post.GetDescription()
                        }))
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

      现在,我们再浏览一个EmployeeList.aspx,性别和岗位都用中文显示出来了吧:

 

      好了,员工管理就这样做完了。通过部门管理和员工管理这两个典型功能的讲解,不知道你对整个过程有没有一个大概的了解了。

      本实例的源代码将在一下篇完成后附上下载链接。

   

发表评论
用户名: 匿名