mvc-百步飞剑-03
说明:第二节的源码压缩包已经上传至https://pan.baidu.com/s/1dFnB3NV中的02文件夹下,本节以及以后章节所需要的内容和源码将会放置对应的目录下.
1 用户管理的完善
1.1 结合jquery-easyui的使用
1.1.1 在BBFJ.OA.WebApp中的Content=>themes文件夹中添加百度云盘03中的themes文件中的内容
1.1.1 在BBFJ.OA.WebApp中的Scripts文件夹中添加百度云盘03的JQuery-easyui文件中的内容
1.2 添加控制器,编写view.注意<script>中一些文件的引用
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="~/Content/themes/default/easyui.css" rel="stylesheet" /> <link href="~/Content/themes/icon.css" rel="stylesheet" /> <script src="~/Scripts/jquery-1.8.2.min.js"></script> <script src="~/Scripts/jquery.easyui.min.js"></script> <script src="~/Scripts/easyui-lang-zh_CN.js"></script> <script src="~/Scripts/datapattern.js"></script> <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script> <script type="text/javascript"> $(function () { $("#addDiv").css("display", "none"); $("#editDiv").css("display", "none"); //给搜索按钮加一个单击事件 $("#btnSearch").click(function () { //获取用户输入的搜索数据. var pars = { name: $("#txtSearchName").val(), remark: $("#txtSearchRemark").val() }; //将获取的搜索的数据发送到服务端。 loadData(pars) }); loadData(); }); function loadData(pars) { $('#tt').datagrid({ url: '/UserInfo/GetUserInfoList', title: '用户数据表格', width: 700, height: 400, fitColumns: true, //列自适应 nowrap: false, idField: 'ID',//主键列的列明 loadMsg: '正在加载用户的信息...', pagination: true,//是否有分页 singleSelect: false,//是否单行选择 pageSize: 5,//页大小,一页多少条数据 pageNumber: 1,//当前页,默认的 pageList: [5, 10, 15], queryParams: pars,//往后台传递参数 columns: [[//c.UserName, c.UserPass, c.Email, c.RegTime { field: 'ck', checkbox: true, align: 'left', width: 50 }, { field: 'ID', title: '编号', width: 80 }, { field: 'UName', title: '姓名', width: 120 }, { field: 'UPwd', title: '密码', width: 120 }, { field: 'Remark', title: '备注', width: 120 }, { field: 'SubTime', title: '时间', width: 80, align: 'right', formatter: function (value, row, index) { return (eval(value.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"))).pattern("yyyy-M-d"); } } ]], toolbar: [{ id: 'btnDelete', text: '删除', iconCls: 'icon-remove', handler: function () { deleteInfo(); } }, { id: 'btnAdd', text: '添加', iconCls: 'icon-add', handler: function () { addInfo(); } }, { id: 'btnEidt', text: '编辑', iconCls: 'icon-edit', handler: function () { showEditInfo(); } }], }); } //删除数据 function deleteInfo() { var rows = $('#tt').datagrid('getSelections');//获取所选择的行 if (!rows || rows.length == 0) { //alert("请选择要修改的商品!"); $.messager.alert("提醒", "请选择要删除的记录!", "error"); return; } $.messager.confirm("提示", "确定要删除数据吗", function (r) { if (r) { //获取要删除的记录的ID值。 var rowsLength = rows.length; var strId = ""; for (var i = 0; i < rowsLength; i++) { strId = strId + rows[i].ID + ",";//1,2,3, } //去掉最后一个逗号. strId = strId.substr(0, strId.length - 1); //将获取的要删除的记录的ID值发送到服务端. $.post("/UserInfo/DeleteUserInfo", { "strId": strId }, function (data) { if (data == "ok") { $('#tt').datagrid('reload');//加载表格不会跳到第一页。 //清除上次操作的历史的记录。 $('#tt').datagrid('clearSelections') } else { $.messager.alert("提醒", "删除记录失败!", "error"); } }); } }); } //添加数据 function addInfo() { $("#addDiv").css("display", "block"); $('#addDiv').dialog({ title: '添加用户数据', width: 300, height: 200, collapsible: true, maximizable: true, resizable: true, modal: true, buttons: [{ text: 'Ok', iconCls: 'icon-ok', handler: function () { //表单校验 validateInfo($("#addForm")); $("#addForm").submit();//提交表单 } }, { text: 'Cancel', handler: function () { $('#addDiv').dialog('close'); } }] }); } //完成添加后调用该方法 function afterAdd(data) { if (data == "ok") { $('#addDiv').dialog('close'); $('#tt').datagrid('reload');//加载表格不会跳到第一页。 $("#addForm input").val(""); } } //表单校验 function validateInfo(control) { control.validate({//表示对哪个form表单进行校验,获取form标签的id属性的值 rules: {//表示验证规则 UName: "required",//表示对哪个表单元素进行校验,要写具体的表单元素的name属性的值 Remark: { required: true }, UPwd: { required: true, minlength: 5 }, Sort: { required: true } }, messages: { UName: "请输入用户名", Remark: { required: "请输入备注" }, UPwd: { required: "请输入密码", minlength: jQuery.format("密码不能小于{0}个字 符") }, Sort: { required: "请输入排序" } } }); } //展示一下要修改的数据. function showEditInfo() { //判断一下用户是否选择了要修改的数据 var rows = $('#tt').datagrid('getSelections');//获取所选择的行 if (rows.length != 1) { $.messager.alert("提示", "请选择要修改的数据", "error"); return; } //将要修改的数据查询出来,显示到文本框中。 var id = rows[0].ID; $.post("/UserInfo/ShowEditInfo", { "id": id }, function (data) { $("#txtUName").val(data.UName); $("#txtUPwd").val(data.UPwd); $("#txtRemark").val(data.Remark); $("#txtSort").val(data.Sort); $("#txtSubTime").val(ChangeDateFormat(data.SubTime)); $("#txtDelFlag").val(data.DelFlag); $("#txtId").val(data.ID); }); $("#editDiv").css("display", "block"); $('#editDiv').dialog({ title: '编辑用户数据', width: 300, height: 200, collapsible: true, maximizable: true, resizable: true, modal: true, buttons: [{ text: 'Ok', iconCls: 'icon-ok', handler: function () { //表单校验 validateInfo($("#editForm")); $("#editForm").submit();//提交表单 } }, { text: 'Cancel', handler: function () { $('#editDiv').dialog('close'); } }] }); } //更新以后调用该方法. function afterEdit(data) { if (data == "ok") { $('#editDiv').dialog('close'); $('#tt').datagrid('reload');//加载表格不会跳到第一页。 } else { $.messager.alert("提示", "修改的数据失败", "error"); } } //将序列化成json格式后日期(毫秒数)转成日期格式 function ChangeDateFormat(cellval) { var date = new Date(parseInt(cellval.replace("/Date(", "").replace(")/", ""), 10)); var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); return date.getFullYear() + "-" + month + "-" + currentDate; } </script> </head> <body> <div> 用户名:<input type="text" id="txtSearchName" /> 备注<input type="text" id="txtSearchRemark" /><a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'" style="width:80px" id="btnSearch">Search</a> <table id="tt" style="width: 700px;" title="标题,可以使用代码进行初始化,也可以使用这种属性的方式" iconcls="icon-edit"></table> </div> <!--------------添加数据----------------------> <div id="addDiv"> @using (Ajax.BeginForm("AddUserInfo", "UserInfo", new { }, new AjaxOptions() { HttpMethod = "post", OnSuccess = "afterAdd" }, new { id = "addForm" })) { <table> <tr><td>用户名</td><td><input type="text" name="UName" /></td></tr> <tr><td>密码</td><td><input type="password" name="UPwd" /></td></tr> <tr><td>备注</td><td><input type="text" name="Remark" /></td></tr> <tr><td>排序</td><td><input type="text" name="Sort" /></td></tr> </table> } </div> <!--------------修改数据----------------------> <div id="editDiv"> @using (Ajax.BeginForm("EditUserInfo", "UserInfo", new { }, new AjaxOptions() { HttpMethod = "post", OnSuccess = "afterEdit" }, new { id = "editForm" })) { <input type="hidden" name="ID" id="txtId" /> <input type="hidden" name="SubTime" id="txtSubTime" /> <input type="hidden" name="DelFlag" id="txtDelFlag" /> <table> <tr><td>用户名</td><td><input type="text" name="UName" id="txtUName" /></td></tr> <tr><td>密码</td><td><input type="text" name="UPwd" id="txtUPwd" /></td></tr> <tr><td>备注</td><td><input type="text" name="Remark" id="txtRemark" /></td></tr> <tr><td>排序</td><td><input type="text" name="Sort" id="txtSort" /></td></tr> </table> } </div> </body> </html>

执行的顺序:通过路由=>Userinfo控制器=>index方法=>找到相应的视图返回给浏览器,
浏览器拿到代码进行渲染=><script>中loadData(),再次发送新情求url:'/UserInfo/GetUserInfoList'
1.3 完善控制器=>分页显示数据
1.3.1 在Model新建一个枚举类型文件夹EnumType,添加一个类用户判断删除标记
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.Model.EnumType { public enum DeleteEnumType { //正常 Normal=0, LogicDelete =1 } }
1.3.2 完善UserInfoController 控制器
using BBFJ.OA.Model; using BBFJ.OA.Model.EnumType; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace BBFJ.OA.WebApp.Controllers { public class UserInfoController : Controller { // // GET: /UserInfo/ IBLL.IUserInfoService UserInfoService = new BLL.UserInfoService(); public ActionResult Index(UserInfo userInfo) { return View(); } #region 02获取列表数据 public ActionResult GetUserInfoList() { int pageIndex = Request["page"] != null ? int.Parse(Request["page"]) : 1; int pageSize = Request["rows"] != null ? int.Parse(Request["rows"]) : 5; int totalCount; short delFlag = (short)DeleteEnumType.Normal; var userInfoList = UserInfoService.LoadPageEntities<int>(pageIndex, pageSize, out totalCount,c => c.DelFlag == delFlag,c=>c.ID,true ); //将数据生成json返回表格 //看表格中需要那些数据,就写那些数据 var temp = from u in userInfoList select new { ID = u.ID, UName = u.UName, UPwd = u.UPwd, Remark = u.Remark, SubTime = u.SubTime }; //返回总的记录数和数据 return Json(new { rows = temp,total = totalCount}); } #endregion } }
1.3.3 显示数据

1.4 批量删除
当在控制器中想调用UserInfoService.DeleteEntity();时发现BLL层原有的方法不能满足批量删除的功能.所以我们要重新定义一个方法.注意先在IUserInfoService接口中定义.
using BBFJ.OA.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.IBLL { public interface IUserInfoService : IBaseService<UserInfo> { bool DeleteEntities(List<int> list); } }
using BBFJ.OA.IBLL; using BBFJ.OA.IDAL; using BBFJ.OA.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.BLL { public class UserInfoService : BaseService<UserInfo>,IUserInfoService { public override void SetCurrentDal() { //子类拿到父类的CurrentDal属性 //子类拿到父类的DBSession属性 CurrentDal = this.CurrentDBSession.UserInfoDal; } #region 02批量删除 public bool DeleteEntities(List<int> list) { //拿到父类的DBSession属性,拿到具体的数据操作类,调用查询方法 var userInfoList = this.CurrentDBSession.UserInfoDal.LoadEntities(u=>list.Contains(u.ID)); foreach (var userInfo in userInfoList) { this.CurrentDBSession.UserInfoDal.DeleteEntity(userInfo); } return this.CurrentDBSession.SaveChanges(); } #endregion } }
using BBFJ.OA.Model; using BBFJ.OA.Model.EnumType; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace BBFJ.OA.WebApp.Controllers { public class UserInfoController : Controller { // // GET: /UserInfo/ IBLL.IUserInfoService UserInfoService = new BLL.UserInfoService(); public ActionResult Index(UserInfo userInfo) { return View(); } #region 02获取列表数据 public ActionResult GetUserInfoList() { int pageIndex = Request["page"] != null ? int.Parse(Request["page"]) : 1; int pageSize = Request["rows"] != null ? int.Parse(Request["rows"]) : 5; int totalCount; short delFlag = (short)DeleteEnumType.Normal; var userInfoList = UserInfoService.LoadPageEntities<int>(pageIndex, pageSize, out totalCount,c => c.DelFlag == delFlag,c=>c.ID,true ); //将数据生成json返回表格 //看表格中需要那些数据,就写那些数据 var temp = from u in userInfoList select new { ID = u.ID, UName = u.UName, UPwd = u.UPwd, Remark = u.Remark, SubTime = u.SubTime }; //返回总的记录数和数据 return Json(new { rows = temp,total = totalCount}); } #endregion #region 02删除用户数据 public ActionResult DeleteUserInfo() { string strId = Request["strId"]; string[] strIds = strId.Split(','); List<int> list = new List<int>(); foreach (string id in strIds) { list.Add(Convert.ToInt32(id)); } //将list集合存储的要删掉记录编号传递到BLL层 if (UserInfoService.DeleteEntities(list)) { return Content("ok"); } else { return Content("no"); } } #endregion } }


1.5 添加数据
using BBFJ.OA.Model; using BBFJ.OA.Model.EnumType; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace BBFJ.OA.WebApp.Controllers { public class UserInfoController : Controller { // // GET: /UserInfo/ IBLL.IUserInfoService UserInfoService = new BLL.UserInfoService(); public ActionResult Index(UserInfo userInfo) { return View(); } #region 02获取列表数据 public ActionResult GetUserInfoList() { int pageIndex = Request["page"] != null ? int.Parse(Request["page"]) : 1; int pageSize = Request["rows"] != null ? int.Parse(Request["rows"]) : 5; int totalCount; short delFlag = (short)DeleteEnumType.Normal; var userInfoList = UserInfoService.LoadPageEntities<int>(pageIndex, pageSize, out totalCount,c => c.DelFlag == delFlag,c=>c.ID,true ); //将数据生成json返回表格 //看表格中需要那些数据,就写那些数据 var temp = from u in userInfoList select new { ID = u.ID, UName = u.UName, UPwd = u.UPwd, Remark = u.Remark, SubTime = u.SubTime }; //返回总的记录数和数据 return Json(new { rows = temp,total = totalCount}); } #endregion #region 02删除用户数据 public ActionResult DeleteUserInfo() { string strId = Request["strId"]; string[] strIds = strId.Split(','); List<int> list = new List<int>(); foreach (string id in strIds) { list.Add(Convert.ToInt32(id)); } //将list集合存储的要删掉记录编号传递到BLL层 if (UserInfoService.DeleteEntities(list)) { return Content("ok"); } else { return Content("no"); } } #endregion #region 03添加用户数据 public ActionResult AddUserInfo(UserInfo userInfo) { userInfo.DelFlag =0; userInfo.ModifiedOn = DateTime.Now; userInfo.SubTime = DateTime.Now; UserInfoService.AddEntity(userInfo) ; return Content("ok"); } #endregion } }


1.6 更新数据
using BBFJ.OA.Model; using BBFJ.OA.Model.EnumType; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace BBFJ.OA.WebApp.Controllers { public class UserInfoController : Controller { // // GET: /UserInfo/ IBLL.IUserInfoService UserInfoService = new BLL.UserInfoService(); public ActionResult Index(UserInfo userInfo) { return View(); } #region 02获取列表数据 public ActionResult GetUserInfoList() { int pageIndex = Request["page"] != null ? int.Parse(Request["page"]) : 1; int pageSize = Request["rows"] != null ? int.Parse(Request["rows"]) : 5; int totalCount; short delFlag = (short)DeleteEnumType.Normal; var userInfoList = UserInfoService.LoadPageEntities<int>(pageIndex, pageSize, out totalCount,c => c.DelFlag == delFlag,c=>c.ID,true ); //将数据生成json返回表格 //看表格中需要那些数据,就写那些数据 var temp = from u in userInfoList select new { ID = u.ID, UName = u.UName, UPwd = u.UPwd, Remark = u.Remark, SubTime = u.SubTime }; //返回总的记录数和数据 return Json(new { rows = temp,total = totalCount}); } #endregion #region 02删除用户数据 public ActionResult DeleteUserInfo() { string strId = Request["strId"]; string[] strIds = strId.Split(','); List<int> list = new List<int>(); foreach (string id in strIds) { list.Add(Convert.ToInt32(id)); } //将list集合存储的要删掉记录编号传递到BLL层 if (UserInfoService.DeleteEntities(list)) { return Content("ok"); } else { return Content("no"); } } #endregion #region 03添加用户数据 public ActionResult AddUserInfo(UserInfo userInfo) { userInfo.DelFlag =0; userInfo.ModifiedOn = DateTime.Now; userInfo.SubTime = DateTime.Now; UserInfoService.AddEntity(userInfo) ; return Content("ok"); } #endregion #region 04展示要修改数据 public ActionResult ShowEditInfo() { int id = int.Parse(Request["id"]); var userInfo = UserInfoService.LoadEntities(u=> u.ID == id).FirstOrDefault(); return Json(userInfo,JsonRequestBehavior.AllowGet); } #endregion #region 05完成数据的更新 public ActionResult EditUserInfo(UserInfo userinfo) { userinfo.ModifiedOn = DateTime.Now; if (UserInfoService.EditEntity(userinfo)) { return Content("ok"); } else { return Content("no"); } } #endregion } }
1.7 检索数据
通过index.cshtml中loadData方法中的queryParams向后台传递检索条件的参数
1.7.1 在控制器中进行接收.此时把搜索条件的进一步封装在Model中.即在Model中添加Search文件夹,并在文件夹中添加UserInfoSearch类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.Model.Search { public class UserInfoSearch { public string UserName { get; set; } public string UserRemark{ get; set; } } }
1.7.2 搜索的结果肯定涉及到分页.那么就少不了pageIndex和pageSize等属性.所以还要创建基类BaseSearch,并让UserInfoSearch继承它.以后有别的检索条件也继承此类.这样就通过封装大大简化了代码.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.Model.Search { public class BaseSearch { public int PageIndex { get; set; } public int PageSize { get; set; } public int TotalCount { get; set; } } }
1.7.3 在业务层添加搜索方法LoadSearchEntities
using BBFJ.OA.IBLL; using BBFJ.OA.IDAL; using BBFJ.OA.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.BLL { public class UserInfoService : BaseService<UserInfo>,IUserInfoService { public override void SetCurrentDal() { //子类拿到父类的CurrentDal属性 //子类拿到父类的DBSession属性 CurrentDal = this.CurrentDBSession.UserInfoDal; } #region 02批量删除 public bool DeleteEntities(List<int> list) { //拿到父类的DBSession属性,拿到具体的数据操作类,调用查询方法 var userInfoList = this.CurrentDBSession.UserInfoDal.LoadEntities(u=>list.Contains(u.ID)); foreach (var userInfo in userInfoList) { this.CurrentDBSession.UserInfoDal.DeleteEntity(userInfo); } return this.CurrentDBSession.SaveChanges(); } #endregion #region 03完成用户信息的搜索 public IQueryable<UserInfo> LoadSearchEntities(Model.Search.UserInfoSearch userInfoSearch,short delFlag) { var temp = this.CurrentDBSession.UserInfoDal.LoadEntities(c=>c.DelFlag == delFlag ); //根据用户名搜索 if (!String.IsNullOrEmpty(userInfoSearch.UserName)) { temp = temp.Where<UserInfo>(u=>u.UName.Contains(userInfoSearch.UserName)); } if (!String.IsNullOrEmpty(userInfoSearch.UserRemark)) { temp = temp.Where<UserInfo>(u => u.Remark.Contains(userInfoSearch.UserRemark)); } userInfoSearch.TotalCount = temp.Count(); return temp.OrderBy<UserInfo, int>(u => u.ID).Skip<UserInfo>((userInfoSearch.PageIndex - 1) * userInfoSearch.PageSize).Take<UserInfo>(userInfoSearch.PageSize); } #endregion } }
1.7.4 在接口中也要有LoadSearchEntities该方法
using BBFJ.OA.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BBFJ.OA.IBLL { public interface IUserInfoService : IBaseService<UserInfo> { bool DeleteEntities(List<int> list); IQueryable<UserInfo> LoadSearchEntities(Model.Search.UserInfoSearch userInfoSearch, short delFlag); } }

补充代码修改,百度网盘中的代码略有缺陷需要修改


浙公网安备 33010602011771号