導(dǎo)入VM

2019-04-04 17:40 更新

BaseTemplateVM和BaseImportVM是框架中負(fù)責(zé)導(dǎo)入的VM,TemplateVM用來定義Excel模板,ImportVM使用TemplateVM定義的模板進(jìn)行導(dǎo)入操作

建立一個(gè)BaseImportVM

ImportVM需要使用TemplateVM中定義的模板,所以建立ImportVM需要兩個(gè)步驟

1. 建立一個(gè)TemplateVM,并定義需要導(dǎo)入的字段

2. 建立一個(gè)ImportVM,將第一步創(chuàng)建的TemplateVM作為泛型變量傳入

下面以學(xué)校的模型為例,演示如何建立一個(gè)ImportVM進(jìn)行學(xué)校信息的導(dǎo)入。學(xué)校模型的定義可以參考第一個(gè)模塊

  1. public class SchoolTemplateVM : BaseTemplateVM
  2. {
  3. [Display(Name = "學(xué)校編碼")]
  4. public ExcelPropety SchoolCode_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolCode);
  5. [Display(Name = "學(xué)校名稱")]
  6. public ExcelPropety SchoolName_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolName);
  7. [Display(Name = "學(xué)校類型")]
  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. }

對(duì)于簡(jiǎn)單的導(dǎo)入,以上代碼就足夠了,只是繼承基類并定義需要導(dǎo)入的字段,框架會(huì)完成導(dǎo)入工作

ExcelPropety是框架提供的類,用來定義需要導(dǎo)入的列
使用BaseImportVM

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

  1. #region 導(dǎo)入
  2. [ActionDescription("導(dǎo)入")]
  3. public ActionResult Import()
  4. {
  5. var vm = CreateVM<SchoolImportVM>();
  6. return PartialView(vm);
  7. }
  8. [HttpPost]
  9. [ActionDescription("導(dǎo)入")]
  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("成功導(dǎo)入 " + vm.EntityList.Count.ToString() + " 行數(shù)據(jù)");
  19. }
  20. }
  21. #endregion

BatchSaveData是ImportVM中定義的函數(shù),它會(huì)進(jìn)行最終的導(dǎo)入數(shù)據(jù)庫的操作

必須使用CreateVM函數(shù)來創(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)證

ImportVM會(huì)根據(jù)關(guān)聯(lián)的Model找到其對(duì)應(yīng)的BaseCRUDVM,如果能找到,則調(diào)用BaseCRUDVM中的Validate和SetDuplicatedCheck方法來進(jìn)行邏輯驗(yàn)證和數(shù)據(jù)重復(fù)性驗(yàn)證

同時(shí),ImportVM本身也可以重寫SetDuplicatedCheck方法,最終框架會(huì)合并ImportVM和BaseCRUDVM中的數(shù)據(jù)重復(fù)性驗(yàn)證

SetDuplicatedCheck的寫法請(qǐng)參考BaseCRUDVM中的對(duì)應(yīng)章節(jié)

復(fù)雜的導(dǎo)入模板

框架支持更復(fù)雜的模板,比如導(dǎo)入的時(shí)候需要用下拉菜單來選擇關(guān)聯(lián)表數(shù)據(jù)

比如前面的例子,如果學(xué)校名稱必須從下拉菜單中選擇,我們可以這樣實(shí)現(xiàn)

  1. public class SchoolTemplateVM : BaseTemplateVM
  2. {
  3. [Display(Name = "學(xué)校編碼")]
  4. public ExcelPropety SchoolCode_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolCode);
  5. [Display(Name = "學(xué)校名稱")]
  6. public ExcelPropety SchoolName_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolName);
  7. [Display(Name = "學(xué)校類型")]
  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設(shè)定為ComboBox,并指定其ListItems就可以了,框架會(huì)在生成模板的時(shí)候自動(dòng)在Excel里生成下拉菜單

主要函數(shù)
函數(shù)
描述
GenerateTemplate()
生成模板
SetEntityList
將模板數(shù)據(jù)保存到本地類中,如果默認(rèn)邏輯不能支持需求,可以在子類中重寫此函數(shù)
BatchSaveData
進(jìn)行最終的數(shù)據(jù)庫寫入操作,如果默認(rèn)邏輯不能支持需求


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)