BaseTemplateVM和BaseImportVM是框架中負(fù)責(zé)導(dǎo)入的VM,TemplateVM用來定義Excel模板,ImportVM使用TemplateVM定義的模板進(jìn)行導(dǎo)入操作
建立一個(gè)BaseImportVMImportVM需要使用TemplateVM中定義的模板,所以建立ImportVM需要兩個(gè)步驟
1. 建立一個(gè)TemplateVM,并定義需要導(dǎo)入的字段
2. 建立一個(gè)ImportVM,將第一步創(chuàng)建的TemplateVM作為泛型變量傳入
下面以學(xué)校的模型為例,演示如何建立一個(gè)ImportVM進(jìn)行學(xué)校信息的導(dǎo)入。學(xué)校模型的定義可以參考第一個(gè)模塊
- public class SchoolTemplateVM : BaseTemplateVM
- {
- [Display(Name = "學(xué)校編碼")]
- public ExcelPropety SchoolCode_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolCode);
- [Display(Name = "學(xué)校名稱")]
- public ExcelPropety SchoolName_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolName);
- [Display(Name = "學(xué)校類型")]
- public ExcelPropety SchoolType_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolType);
- [Display(Name = "備注")]
- public ExcelPropety Remark_Excel = ExcelPropety.CreateProperty<School>(x => x.Remark);
- }
- public class SchoolImportVM : BaseImportVM<SchoolTemplateVM, School>
- {
- }
-
對(duì)于簡(jiǎn)單的導(dǎo)入,以上代碼就足夠了,只是繼承基類并定義需要導(dǎo)入的字段,框架會(huì)完成導(dǎo)入工作
ExcelPropety是框架提供的類,用來定義需要導(dǎo)入的列
在Controller中使用BaseImportVM的步驟也是一目了然,請(qǐng)看下面的例子
- #region 導(dǎo)入
- [ActionDescription("導(dǎo)入")]
- public ActionResult Import()
- {
- var vm = CreateVM<SchoolImportVM>();
- return PartialView(vm);
- }
- [HttpPost]
- [ActionDescription("導(dǎo)入")]
- public ActionResult Import(SchoolImportVM vm, IFormCollection nouse)
- {
- if (vm.ErrorListVM.EntityList.Count > 0 || !vm.BatchSaveData())
- {
- return PartialView(vm);
- }
- else
- {
- return FFResult().RefreshGrid().CloseDialog().Alert("成功導(dǎo)入 " + vm.EntityList.Count.ToString() + " 行數(shù)據(jù)");
- }
- }
- #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等
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)入的時(shí)候需要用下拉菜單來選擇關(guān)聯(lián)表數(shù)據(jù)
比如前面的例子,如果學(xué)校名稱必須從下拉菜單中選擇,我們可以這樣實(shí)現(xiàn)
- public class SchoolTemplateVM : BaseTemplateVM
- {
- [Display(Name = "學(xué)校編碼")]
- public ExcelPropety SchoolCode_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolCode);
- [Display(Name = "學(xué)校名稱")]
- public ExcelPropety SchoolName_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolName);
- [Display(Name = "學(xué)校類型")]
- public ExcelPropety SchoolType_Excel = ExcelPropety.CreateProperty<School>(x => x.SchoolType);
- [Display(Name = "備注")]
- public ExcelPropety Remark_Excel = ExcelPropety.CreateProperty<School>(x => x.Remark);
- protected override void InitVM()
- {
- SchoolName_Excel.DataType = ColumnDataType.ComboBox;
- SchoolName_Excel.ListItems = new List<ComboSelectListItem>
- {
- new ComboSelectListItem{ Text="aaa", Value="aaa"},
- new ComboSelectListItem{ Text="bbb", Value="bbb"},
- new ComboSelectListItem{ Text="ccc", Value="ccc"},
- new ComboSelectListItem{ Text="ddd", Value="ddd"},
- };
- }
- }
- public class SchoolImportVM : BaseImportVM<SchoolTemplateVM, School>
- {
- }
-
如上所示,我們將SchoolName列的DataType設(shè)定為ComboBox,并指定其ListItems就可以了,框架會(huì)在生成模板的時(shí)候自動(dòng)在Excel里生成下拉菜單
函數(shù) | 描述 |
---|
GenerateTemplate() | 生成模板 |
SetEntityList | 將模板數(shù)據(jù)保存到本地類中,如果默認(rèn)邏輯不能支持需求,可以在子類中重寫此函數(shù) |
BatchSaveData | 進(jìn)行最終的數(shù)據(jù)庫寫入操作,如果默認(rèn)邏輯不能支持需求 |
更多建議: