數(shù)據(jù)操作VM

2019-04-04 17:40 更新

BaseCRUDVM是框架中負(fù)責(zé)增刪改的VM,它繼承自BaseVM,提供了標(biāo)準(zhǔn)的DoAdd,DoEdit,DoDelete函數(shù)

建立一個(gè)BaseCRUDVM

建立BaseCRUDVM非常簡(jiǎn)單,只需要將關(guān)聯(lián)的Model作為泛型變量就可以了。下面以學(xué)校的模型為例,學(xué)校模型的定義可以參考第一個(gè)模塊

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

是的,就是這么簡(jiǎn)單,對(duì)于沒(méi)有附加要求的單表來(lái)說(shuō),只是繼承BaseCRUDVM就足夠了

使用BaseCRUDVM

在Controller中使用BaseCRUDVM的步驟也是一目了然,請(qǐng)看下面的例子

  1. [ActionDescription("學(xué)校管理")]
  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 詳細(xì)
  72. [ActionDescription("詳細(xì)")]
  73. public ActionResult Details(Guid id)
  74. {
  75. var vm = CreateVM<SchoolVM>(id);
  76. return PartialView(vm);
  77. }
  78. #endregion
  79. }

必須使用CreateVM函數(shù)來(lái)創(chuàng)建ViewModel,而不要直接new。CreateVM函數(shù)會(huì)將當(dāng)前Controller的Session,ModelState等信息傳遞給VM,并進(jìn)行一些框架內(nèi)部的操作

FFResult是框架提供的一個(gè)輔助類,主要是方便開發(fā)人員返回常用js,比如關(guān)閉當(dāng)前窗口,刷新grid等

自定義驗(yàn)證

BaseCRUDVM繼承自BaseVM,所以一樣可以通過(guò)重寫Validate方法來(lái)實(shí)現(xiàn)復(fù)雜的自定義驗(yàn)證

同時(shí),對(duì)于使用比較多的字段唯一性的驗(yàn)證,BaseCRUDVM提供了一個(gè)更方便的方式,重寫SetDuplicatedCheck方法

下面的例子擴(kuò)充了SchoolVM,加入了唯一性的驗(yàn)證,SchoolCode和SchoolName兩個(gè)字段都不能重復(fù)

  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. }

框架同時(shí)支持組合字段的唯一性驗(yàn)證,比如下面的例子,SchoolName和SchoolType兩個(gè)字段組合起來(lái)不能重復(fù),同時(shí)SchoolCode也不能重復(fù)

  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. }
主要函數(shù)
函數(shù)
描述
DoAdd()
數(shù)據(jù)庫(kù)添加操作
DoEdit(bool updateAllFields = false)
數(shù)據(jù)庫(kù)修改操作,updateAllFields默認(rèn)為false,只修改Post回來(lái)的字段,如果updateAllFields為true,將修改所有字段
DoDelete()
數(shù)據(jù)庫(kù)刪除操作,對(duì)于繼承自PersistPoco的模型,會(huì)把IsValid字段設(shè)為false,從而進(jìn)行假刪除
DoRealDelete()
無(wú)論是否繼承自PersistPoco,都進(jìn)行刪除
GetById(Guid Id)
根據(jù)Id獲取Model
SetInclude(params Expression<Func<TModel, object>>[] exps)
設(shè)置默認(rèn)關(guān)聯(lián)的表,一般在構(gòu)造函數(shù)中調(diào)用,然后在GetById中會(huì)自動(dòng)關(guān)聯(lián)設(shè)置的表

DoAdd,DoEdit,DoDelete,DoRealDelete都有默認(rèn)實(shí)現(xiàn),對(duì)于更加復(fù)雜的邏輯,可以重寫這些方法


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)