数据操作VM

2019-04-04 17:40 更新

BaseCRUDVM是框架中负责增删改的VM,它继承自BaseVM,提供了标准的DoAdd,DoEdit,DoDelete函数

建立一个BaseCRUDVM

建立BaseCRUDVM非常简单,只需要将关联的Model作为泛型变量就可以了。下面以学校的模型为例,学校模型的定义可以参考第一个模块

  1. public class SchoolVM : BaseCRUDVM<School>
  2. {
  3. }

是的,就是这么简单,对于没有附加要求的单表来说,只是继承BaseCRUDVM就足够了

使用BaseCRUDVM

在Controller中使用BaseCRUDVM的步骤也是一目了然,请看下面的例子

  1. [ActionDescription("学校管理")]
  2. public class SchoolController : BaseController
  3. {
  4. #region 新建
  5. [ActionDescription("新建")]
  6. public ActionResult Create()
  7. {
  8. var vm = CreateVM<SchoolVM>();
  9. return PartialView(vm);
  10. }
  11. [HttpPost]
  12. [ActionDescription("新建")]
  13. public ActionResult Create(SchoolVM vm)
  14. {
  15. if (!ModelState.IsValid)
  16. {
  17. return PartialView(vm);
  18. }
  19. else
  20. {
  21. vm.DoAdd();
  22. return FFResult().CloseDialog().RefreshGrid();
  23. }
  24. }
  25. #endregion
  26. #region 修改
  27. [ActionDescription("修改")]
  28. public ActionResult Edit(Guid id)
  29. {
  30. var vm = CreateVM<SchoolVM>(id);
  31. return PartialView(vm);
  32. }
  33. [ActionDescription("修改")]
  34. [HttpPost]
  35. public ActionResult Edit(SchoolVM vm)
  36. {
  37. if (!ModelState.IsValid)
  38. {
  39. return PartialView(vm);
  40. }
  41. else
  42. {
  43. vm.DoEdit();
  44. return FFResult().CloseDialog().RefreshGridRow(vm.Entity.ID);
  45. }
  46. }
  47. #endregion
  48. #region 删除
  49. [ActionDescription("删除")]
  50. public ActionResult Delete(Guid id)
  51. {
  52. var vm = CreateVM<SchoolVM>(id);
  53. return PartialView(vm);
  54. }
  55. [ActionDescription("删除")]
  56. [HttpPost]
  57. public ActionResult Delete(Guid id, IFormCollection nouse)
  58. {
  59. var vm = CreateVM<SchoolVM>(id);
  60. vm.DoDelete();
  61. if (!ModelState.IsValid)
  62. {
  63. return PartialView(vm);
  64. }
  65. else
  66. {
  67. return FFResult().CloseDialog().RefreshGrid();
  68. }
  69. }
  70. #endregion
  71. #region 详细
  72. [ActionDescription("详细")]
  73. public ActionResult Details(Guid id)
  74. {
  75. var vm = CreateVM<SchoolVM>(id);
  76. return PartialView(vm);
  77. }
  78. #endregion
  79. }

必须使用CreateVM函数来创建ViewModel,而不要直接new。CreateVM函数会将当前Controller的Session,ModelState等信息传递给VM,并进行一些框架内部的操作

FFResult是框架提供的一个辅助类,主要是方便开发人员返回常用js,比如关闭当前窗口,刷新grid等

自定义验证

BaseCRUDVM继承自BaseVM,所以一样可以通过重写Validate方法来实现复杂的自定义验证

同时,对于使用比较多的字段唯一性的验证,BaseCRUDVM提供了一个更方便的方式,重写SetDuplicatedCheck方法

下面的例子扩充了SchoolVM,加入了唯一性的验证,SchoolCode和SchoolName两个字段都不能重复

  1. public class SchoolVM : BaseCRUDVM<School>
  2. {
  3. public override DuplicatedInfo<School> SetDuplicatedCheck()
  4. {
  5. var rv = CreateFieldsInfo(SimpleField(x => x.SchoolCode));
  6. rv.AddGroup(SimpleField(x => x.SchoolName));
  7. return rv;
  8. }
  9. }

框架同时支持组合字段的唯一性验证,比如下面的例子,SchoolName和SchoolType两个字段组合起来不能重复,同时SchoolCode也不能重复

  1. public class SchoolVM : BaseCRUDVM<School>
  2. {
  3. public override DuplicatedInfo<School> SetDuplicatedCheck()
  4. {
  5. var rv = CreateFieldsInfo(SimpleField(x => x.SchoolName),SimpleField(x => x.SchoolType));
  6. rv.AddGroup(SimpleField(x => x.SchoolCode));
  7. return rv;
  8. }
  9. }
主要函数
函数
描述
DoAdd()
数据库添加操作
DoEdit(bool updateAllFields = false)
数据库修改操作,updateAllFields默认为false,只修改Post回来的字段,如果updateAllFields为true,将修改所有字段
DoDelete()
数据库删除操作,对于继承自PersistPoco的模型,会把IsValid字段设为false,从而进行假删除
DoRealDelete()
无论是否继承自PersistPoco,都进行删除
GetById(Guid Id)
根据Id获取Model
SetInclude(params Expression<Func<TModel, object>>[] exps)
设置默认关联的表,一般在构造函数中调用,然后在GetById中会自动关联设置的表

DoAdd,DoEdit,DoDelete,DoRealDelete都有默认实现,对于更加复杂的逻辑,可以重写这些方法


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号