WTM 多附件上传使用心得
WTM多附件上传初基本使用步奏:
1.创建一个新的表格 <TableA>,用于记录多附件上传的外键,一个外键指向拥有多附件的主表<MasterA>ID,一个外键指向FileAttachment 的ID
public class TableA : TopBasePoco, ISubFile { [Display(Name = "MasterA")] public Guid MasterAId { get; set; } public MasterA MasterA { get; set; } //ISubFile定义的字段 public Guid FileId { get; set; } public FileAttachment File { get; set; } public int order { get; set; } }
2.。在主表<MasterA>中添加新表格 关于<TableA> 的list
public List<TableA> TableAList { get; set; }
3. 在界面使用
<wt:multiupload field="Entity.TableAList" upload-type="AllFiles" num-file-once="10"/>
在实际使用时遇到的问题:
WTM多附件上传时,在界面删除附件后保存前,实际在硬盘和FileAttachment 中没有删除,WTM是在保存后才会删除多余的文件了。WTM源代码的做法是在界面将多余的文件记录在DeleteFilesIds 这个file 里面。然后在CURD 时操作实际的删除。[源码链接]
/// <summary> /// 添加,进行默认的添加操作。子类如有自定义操作应重载本函数 /// </summary> public virtual void DoAdd() { DoAddPrepare(); //删除不需要的附件 if (DeletedFileIds != null) { foreach (var item in DeletedFileIds) { FileAttachmentVM ofa = new FileAttachmentVM(); ofa.CopyContext(this); ofa.SetEntityById(item); ofa.DoDelete(); } } DC.SaveChanges(); }
于是会产生bug,如果用户删除了文件后,并没有保存就关闭,这时候无法实际删除文件。
我的解决方案:
为此我做的改动是,修改TagHelper,在TagHelper 中增加ajax call ,使得在界面删除时,直接调用 '/api/_file/DeletedFile/' + fileid, 去删除实际的文件。【MultiUpload 源码】
function {Id}DoActualDelete(fileid){{ $.ajax({{ type: 'get', url: '/api/_file/DeletedFile/' + fileid, success: function () {{ console.log('deleted'); }}, error: function () {{ console.log('failed'); }} }}); }}
当使用修改后的TagHelper时,要注意在增删查改的时候要将 DeletedFields 设为null, 这样就不会触发WTM 的code 再去删除多一遍而引发错误了。
vm.DeletedFileIds = null; vm.DoAdd();
在界面使用你修改过的Tag helper
<yourcusttaghelper:multiupload field="Entity.TableAList" upload-type="AllFiles" num-file-once="10"/>
最后2021年1月23日更新:此问题已经在Net5版本得到完美解决。