篇(7)-Asp.Net Core入门实战-从系统菜单功能的增删改查开始(二:修改和删除)
入门实战-从系统菜单功能的增删改查开始(一:修改和删除)
上一篇讲了查询和增加,本章节就把修改和删除讲完。
1.实现修改功能。
(1).在MenuController中增加2个Action:Edit,分别是HttpGet和HttpPost;
在post类型的Edit中注意参数,并完善修改代码:
HttpPost的Edit 方法,有点特殊,我先看一个参数,就是把Menu对象传递为编辑时的参数情况:
我的目的是更新成功返回True,但发现_appDbContext.Menu.Update(menu)的执行返回结果居然是个Id值,而且调试跟踪也出了异常,有空值。为什么呢?这样的写法肯定不对,
将对象menu作为参数,那么依照自动绑定机制,从view传递过来就3个值,其他值肯定为空,如果在用menu作为更新对象,那么就是将很多字段空值更新原有表,这个逻辑就错了。所以,需要向找到旧的值,将不变的赋值给对象,然后重新更新。我下面修正后的更新代码,Edit用到2个参数(int id,Menu menu):
当然这只是一种更新方式,EF有常用的三种更新方式的代码,我从网络上挪下来,看看你习惯用那种(具体的区别,自行百度一下EF更新数据的三种方式):
AppDbContext db = new AppDbContext(); var test = db.Menu.Find(1); test.DisplayName = "第1种更新方式"; db.SaveChanges(); AppDbContext db = new AppDbContext(); Menu test = new Menu() { Id = 1, DisplayName = "第2种更新方式" }; db.Entry(test).State = EntityState.Modified; db.SaveChanges(); AppDbContext db = new AppDbContext(); Menu test = new Menu() { Id = 1, DisplayName = "第3种更新方式" }; db.Menu.Attach(test); db.Entry(test).Property("DisplayName").IsModified = true; db.SaveChanges();
(2).在Views中增加Menu的Edit视图:注意此编辑页面视图,先要引用model指令,指定强类型对象,然后指定action,并添加一个hidden控件,存储ID值,当提交编辑值时,能传递主键ID值,最后使用asp-for来显示数据。
(3).在Menu的Index视图中,也就是列表页,修改Edit按钮(连接):加上Action和Controller以及编辑参数;
2.实现删除功能
(1). 在Menu的Index视图中,也就是列表页,修改Delete按钮(连接):加上Action和Controller以及删除参数:
(2).在MenuController中增加1个Action:Delete,注意参数,并完善删除代码:
3.我们顺便完善一下Details(查看)的功能,因为比较简单,就是一个单独的对象查询,我写出代码如下:
(1).在MenuController中增加一个Details的action:
(2).在Views视图中增加一个Details的视图,注意对象读取赋值
4.批量删除,需要使用复选框来多选,从而实现批量删除的功能
(1).现在View部分的Index视图,每行价格checkbox,用来选择;增加一个批量删除的标签,编写Js代码,给其一个点击函数;
(2).在View部分的Index视图,增加Js代码部分,实现通过前台获取选择复选框的Id值;给[批量删除]标签编写一个可点击函数,函数内获取CheckBox选中值,然后通过Jquery的Ajax函数调用后台Action。
(3).然后在Controller部分的MenuController.cs文件中,增加一个DeleteAll的Action,参数,用选择的多个Id做参数,然后在代码内拆分后循环遍历;
[HttpPost] public IActionResult DeleteAll(string idString){ int countSuccessDel = 0;//记录删除成功条数 int countFailedDel = 0;//记录删除失败条数 if (idString.Length > 0) { if (idString.IndexOf(',') > 0) { string[] ids = idString.Split(','); foreach (string id in ids) { //注意,也可以改造上面的Delete方法,直接调用即可; var delMenu = _appDbContext.Menu.FirstOrDefault(x => x.Id == int.Parse(id)); if (delMenu != null) _appDbContext.Menu.Remove(delMenu); var result = _appDbContext.SaveChanges(); if (result == 1) countSuccessDel++;//此处计数使用 else countFailedDel++; } if (countSuccessDel > 0) return RedirectToAction("Index"); else return BadRequest("删除失败"); } else { //只选了一个 var delMenu = _appDbContext.Menu.FirstOrDefault(x => x.Id == int.Parse(idString)); if (delMenu != null) _appDbContext.Menu.Remove(delMenu); var result = _appDbContext.SaveChanges(); if (result == 1) countSuccessDel++; //此处计数使用 else countFailedDel++; if (countSuccessDel > 0) return RedirectToAction("Index"); else return BadRequest("删除失败"); } } return BadRequest("失败"); }
至此,批量删除功能完成。