篇(7)-Asp.Net Core入门实战-从系统菜单功能的增删改查开始(二:修改和删除 ...

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

入门实战-从系统菜单功能的增删改查开始(一:修改和删除)
上一篇讲了查询和增加,本章节就把修改和删除讲完。
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更新数据的三种方式):
  1. AppDbContext db = new AppDbContext();
  2. var test = db.Menu.Find(1);
  3. test.DisplayName = "第1种更新方式";
  4. db.SaveChanges();
  5. AppDbContext db = new AppDbContext();
  6. Menu test = new Menu() { Id = 1, DisplayName = "第2种更新方式" };
  7. db.Entry(test).State = EntityState.Modified;
  8. db.SaveChanges();
  9. AppDbContext db = new AppDbContext();
  10. Menu test = new Menu() { Id = 1, DisplayName = "第3种更新方式" };
  11. db.Menu.Attach(test);
  12. db.Entry(test).Property("DisplayName").IsModified = true;
  13. 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做参数,然后在代码内拆分后循环遍历;
  1. [HttpPost]
  2. public IActionResult DeleteAll(string idString){
  3. int countSuccessDel = 0;//记录删除成功条数
  4. int countFailedDel = 0;//记录删除失败条数
  5. if (idString.Length > 0)
  6. {
  7. if (idString.IndexOf(',') > 0)
  8. {
  9. string[] ids = idString.Split(',');
  10. foreach (string id in ids)
  11. {
  12. //注意,也可以改造上面的Delete方法,直接调用即可;
  13. var delMenu = _appDbContext.Menu.FirstOrDefault(x => x.Id == int.Parse(id));
  14. if (delMenu != null)
  15. _appDbContext.Menu.Remove(delMenu);
  16. var result = _appDbContext.SaveChanges();
  17. if (result == 1)
  18. countSuccessDel++;//此处计数使用
  19. else
  20. countFailedDel++;
  21. }
  22. if (countSuccessDel > 0)
  23. return RedirectToAction("Index");
  24. else
  25. return BadRequest("删除失败");
  26. }
  27. else
  28. {
  29. //只选了一个
  30. var delMenu = _appDbContext.Menu.FirstOrDefault(x => x.Id == int.Parse(idString));
  31. if (delMenu != null)
  32. _appDbContext.Menu.Remove(delMenu);
  33. var result = _appDbContext.SaveChanges();
  34. if (result == 1)
  35.   countSuccessDel++; //此处计数使用
  36. else
  37.   countFailedDel++;
  38. if (countSuccessDel > 0)
  39.   return RedirectToAction("Index");
  40. else
  41.   return BadRequest("删除失败");
  42. }
  43. }
  44. return BadRequest("失败");
  45. }
复制代码
 
至此,批量删除功能完成。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表