数据操作VM
BaseCRUDVM是框架中负责增删改的VM,它继承自BaseVM,提供了标准的DoAdd,DoEdit,DoDelete函数
建立一个BaseCRUDVM建立BaseCRUDVM非常简单,只需要将关联的Model作为泛型变量就可以了。下面以学校的模型为例,学校模型的定义可以参考第一个模块
- public class SchoolVM : BaseCRUDVM<School>
- {
- }
-
是的,就是这么简单,对于没有附加要求的单表来说,只是继承BaseCRUDVM就足够了
在Controller中使用BaseCRUDVM的步骤也是一目了然,请看下面的例子
- [ActionDescription("学校管理")]
- 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 详细
- [ActionDescription("详细")]
- public ActionResult Details(Guid id)
- {
- var vm = CreateVM<SchoolVM>(id);
- return PartialView(vm);
- }
- #endregion
- }
-
必须使用CreateVM函数来创建ViewModel,而不要直接new。CreateVM函数会将当前Controller的Session,ModelState等信息传递给VM,并进行一些框架内部的操作
FFResult是框架提供的一个辅助类,主要是方便开发人员返回常用js,比如关闭当前窗口,刷新grid等
BaseCRUDVM继承自BaseVM,所以一样可以通过重写Validate方法来实现复杂的自定义验证
同时,对于使用比较多的字段唯一性的验证,BaseCRUDVM提供了一个更方便的方式,重写SetDuplicatedCheck方法
下面的例子扩充了SchoolVM,加入了唯一性的验证,SchoolCode和SchoolName两个字段都不能重复
- 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两个字段组合起来不能重复,同时SchoolCode也不能重复
- 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;
- }
- }
-
函数 | 描述 |
---|
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都有默认实现,对于更加复杂的逻辑,可以重写这些方法
更多建议: