BaseCRUDVM是框架中負(fù)責(zé)增刪改的VM,它繼承自BaseVM,提供了標(biāo)準(zhǔn)的DoAdd,DoEdit,DoDelete函數(shù)
建立一個BaseCRUDVM建立BaseCRUDVM非常簡單,只需要將關(guān)聯(lián)的Model作為泛型變量就可以了。下面以學(xué)校的模型為例,學(xué)校模型的定義可以參考第一個模塊
- public class SchoolVM : BaseCRUDVM<School>
- {
- }
-
是的,就是這么簡單,對于沒有附加要求的單表來說,只是繼承BaseCRUDVM就足夠了
在Controller中使用BaseCRUDVM的步驟也是一目了然,請看下面的例子
- [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ù)來創(chuàng)建ViewModel,而不要直接new。CreateVM函數(shù)會將當(dāng)前Controller的Session,ModelState等信息傳遞給VM,并進(jìn)行一些框架內(nèi)部的操作
FFResult是框架提供的一個輔助類,主要是方便開發(fā)人員返回常用js,比如關(guān)閉當(dāng)前窗口,刷新grid等
BaseCRUDVM繼承自BaseVM,所以一樣可以通過重寫Validate方法來實現(xiàn)復(fù)雜的自定義驗證
同時,對于使用比較多的字段唯一性的驗證,BaseCRUDVM提供了一個更方便的方式,重寫SetDuplicatedCheck方法
下面的例子擴充了SchoolVM,加入了唯一性的驗證,SchoolCode和SchoolName兩個字段都不能重復(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;
- }
- }
-
框架同時支持組合字段的唯一性驗證,比如下面的例子,SchoolName和SchoolType兩個字段組合起來不能重復(fù),同時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ù)庫添加操作 |
DoEdit(bool updateAllFields = false) | 數(shù)據(jù)庫修改操作,updateAllFields默認(rèn)為false,只修改Post回來的字段,如果updateAllFields為true,將修改所有字段 |
DoDelete() | 數(shù)據(jù)庫刪除操作,對于繼承自PersistPoco的模型,會把IsValid字段設(shè)為false,從而進(jìn)行假刪除 |
DoRealDelete() | 無論是否繼承自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中會自動關(guān)聯(lián)設(shè)置的表 |
DoAdd,DoEdit,DoDelete,DoRealDelete都有默認(rèn)實現(xiàn),對于更加復(fù)雜的邏輯,可以重寫這些方法
更多建議: