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è)模塊
- public class SchoolVM : BaseCRUDVM<School>
- {
- }
-
是的,就是這么簡(jiǎn)單,對(duì)于沒(méi)有附加要求的單表來(lái)說(shuō),只是繼承BaseCRUDVM就足夠了
在Controller中使用BaseCRUDVM的步驟也是一目了然,請(qǐng)看下面的例子
- [ActionDescription("學(xué)校管理")]
- public class SchoolController : BaseController
- {
- #region 新建
- [ActionDescription("新建")]
- public ActionResult Create()
- {
- var vm = CreateVM<SchoolVM>();
- return PartialView(vm);
- }
- [HttpPost]
- [ActionDescription("新建")]
- public ActionResult Create(SchoolVM vm)
- {
- if (!ModelState.IsValid)
- {
- return PartialView(vm);
- }
- else
- {
- vm.DoAdd();
- return FFResult().CloseDialog().RefreshGrid();
- }
- }
- #endregion
- #region 修改
- [ActionDescription("修改")]
- public ActionResult Edit(Guid id)
- {
- var vm = CreateVM<SchoolVM>(id);
- return PartialView(vm);
- }
- [ActionDescription("修改")]
- [HttpPost]
- public ActionResult Edit(SchoolVM vm)
- {
- if (!ModelState.IsValid)
- {
- return PartialView(vm);
- }
- else
- {
- vm.DoEdit();
- return FFResult().CloseDialog().RefreshGridRow(vm.Entity.ID);
- }
- }
- #endregion
- #region 刪除
- [ActionDescription("刪除")]
- public ActionResult Delete(Guid id)
- {
- var vm = CreateVM<SchoolVM>(id);
- return PartialView(vm);
- }
- [ActionDescription("刪除")]
- [HttpPost]
- public ActionResult Delete(Guid id, IFormCollection nouse)
- {
- var vm = CreateVM<SchoolVM>(id);
- vm.DoDelete();
- if (!ModelState.IsValid)
- {
- return PartialView(vm);
- }
- else
- {
- return FFResult().CloseDialog().RefreshGrid();
- }
- }
- #endregion
- #region 詳細(xì)
- [ActionDescription("詳細(xì)")]
- public ActionResult Details(Guid id)
- {
- var vm = CreateVM<SchoolVM>(id);
- return PartialView(vm);
- }
- #endregion
- }
-
必須使用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等
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ù)
- public class SchoolVM : BaseCRUDVM<School>
- {
- public override DuplicatedInfo<School> SetDuplicatedCheck()
- {
- var rv = CreateFieldsInfo(SimpleField(x => x.SchoolCode));
- rv.AddGroup(SimpleField(x => x.SchoolName));
- return rv;
- }
- }
-
框架同時(shí)支持組合字段的唯一性驗(yàn)證,比如下面的例子,SchoolName和SchoolType兩個(gè)字段組合起來(lái)不能重復(fù),同時(shí)SchoolCode也不能重復(fù)
- public class SchoolVM : BaseCRUDVM<School>
- {
- public override DuplicatedInfo<School> SetDuplicatedCheck()
- {
- var rv = CreateFieldsInfo(SimpleField(x => x.SchoolName),SimpleField(x => x.SchoolType));
- rv.AddGroup(SimpleField(x => x.SchoolCode));
- return rv;
- }
- }
-
函數(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ù)雜的邏輯,可以重寫這些方法
更多建議: