导入VM

2019-04-04 17:40 更新

BaseTemplateVM和BaseImportVM是框架中负责导入的VM,TemplateVM用来定义Excel模板,ImportVM使用TemplateVM定义的模板进行导入操作

建立一个BaseImportVM

ImportVM需要使用TemplateVM中定义的模板,所以建立ImportVM需要两个步骤

1. 建立一个TemplateVM,并定义需要导入的字段

2. 建立一个ImportVM,将第一步创建的TemplateVM作为泛型变量传入

下面以学校的模型为例,演示如何建立一个ImportVM进行学校信息的导入。学校模型的定义可以参考第一个模块

  1. public class SchoolTemplateVM : BaseTemplateVM
  2. {
  3. [Display(Name = "学校编码")]
  4. public ExcelPropety SchoolCode_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolCode);
  5. [Display(Name = "学校名称")]
  6. public ExcelPropety SchoolName_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolName);
  7. [Display(Name = "学校类型")]
  8. public ExcelPropety SchoolType_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolType);
  9. [Display(Name = "备注")]
  10. public ExcelPropety Remark_Excel = ExcelPropety.CreateProperty<School>(x => x.Remark);
  11. }
  12. public class SchoolImportVM : BaseImportVM<SchoolTemplateVM, School>
  13. {
  14. }

对于简单的导入,以上代码就足够了,只是继承基类并定义需要导入的字段,框架会完成导入工作

ExcelPropety是框架提供的类,用来定义需要导入的列
使用BaseImportVM

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

  1. #region 导入
  2. [ActionDescription("导入")]
  3. public ActionResult Import()
  4. {
  5. var vm = CreateVM<SchoolImportVM>();
  6. return PartialView(vm);
  7. }
  8. [HttpPost]
  9. [ActionDescription("导入")]
  10. public ActionResult Import(SchoolImportVM vm, IFormCollection nouse)
  11. {
  12. if (vm.ErrorListVM.EntityList.Count > 0 || !vm.BatchSaveData())
  13. {
  14. return PartialView(vm);
  15. }
  16. else
  17. {
  18. return FFResult().RefreshGrid().CloseDialog().Alert("成功导入 " + vm.EntityList.Count.ToString() + " 行数据");
  19. }
  20. }
  21. #endregion

BatchSaveData是ImportVM中定义的函数,它会进行最终的导入数据库的操作

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

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

自定义验证

ImportVM会根据关联的Model找到其对应的BaseCRUDVM,如果能找到,则调用BaseCRUDVM中的Validate和SetDuplicatedCheck方法来进行逻辑验证和数据重复性验证

同时,ImportVM本身也可以重写SetDuplicatedCheck方法,最终框架会合并ImportVM和BaseCRUDVM中的数据重复性验证

SetDuplicatedCheck的写法请参考BaseCRUDVM中的对应章节

复杂的导入模板

框架支持更复杂的模板,比如导入的时候需要用下拉菜单来选择关联表数据

比如前面的例子,如果学校名称必须从下拉菜单中选择,我们可以这样实现

  1. public class SchoolTemplateVM : BaseTemplateVM
  2. {
  3. [Display(Name = "学校编码")]
  4. public ExcelPropety SchoolCode_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolCode);
  5. [Display(Name = "学校名称")]
  6. public ExcelPropety SchoolName_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolName);
  7. [Display(Name = "学校类型")]
  8. public ExcelPropety SchoolType_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolType);
  9. [Display(Name = "备注")]
  10. public ExcelPropety Remark_Excel = ExcelPropety.CreateProperty<School>(x => x.Remark);
  11. protected override void InitVM()
  12. {
  13. SchoolName_Excel.DataType = ColumnDataType.ComboBox;
  14. SchoolName_Excel.ListItems = new List<ComboSelectListItem>
  15. {
  16. new ComboSelectListItem{ Text="aaa", Value="aaa"},
  17. new ComboSelectListItem{ Text="bbb", Value="bbb"},
  18. new ComboSelectListItem{ Text="ccc", Value="ccc"},
  19. new ComboSelectListItem{ Text="ddd", Value="ddd"},
  20. };
  21. }
  22. }
  23. public class SchoolImportVM : BaseImportVM<SchoolTemplateVM, School>
  24. {
  25. }

如上所示,我们将SchoolName列的DataType设定为ComboBox,并指定其ListItems就可以了,框架会在生成模板的时候自动在Excel里生成下拉菜单

主要函数
函数
描述
GenerateTemplate()
生成模板
SetEntityList
将模板数据保存到本地类中,如果默认逻辑不能支持需求,可以在子类中重写此函数
BatchSaveData
进行最终的数据库写入操作,如果默认逻辑不能支持需求


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

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号