public override void Process(TagHelperContext context, TagHelperOutput output) { if (Loading == null) { Loading = true; } var vmQualifiedName = Vm.Model.GetType().AssemblyQualifiedName; vmQualifiedName = vmQualifiedName.Substring(0, vmQualifiedName.LastIndexOf(", Version=")); var tempGridTitleId = Guid.NewGuid().ToNoSplitString(); output.TagName = "table"; output.Attributes.Add("id", Id); output.Attributes.Add("lay-filter", Id); output.TagMode = TagMode.StartTagAndEndTag; //IEnumerable<TopBasePoco> data = null; if (Limit == null) { Limit = GlobalServices.GetRequiredService <Configs>()?.RPP; } if (Limits == null) { Limits = new int[] { 10, 20, 50, 80, 100, 150, 200 }; if (!Limits.Contains(Limit.Value)) { var list = Limits.ToList(); list.Add(Limit.Value); Limits = list.OrderBy(x => x).ToArray(); } } // TODO 转换有问题 Page = ListVM.NeedPage; if (UseLocalData) { // 不需要分页 ListVM.NeedPage = false; //data = ListVM.GetEntityList().ToList(); } else if (string.IsNullOrEmpty(Url)) { Url = "/_Framework/GetPagingData"; if (Filter == null) { Filter = new Dictionary <string, object>(); } Filter.Add("_DONOT_USE_VMNAME", vmQualifiedName); Filter.Add("SearcherMode", ListVM.SearcherMode); if (ListVM.Ids != null && ListVM.Ids.Count > 0) { Filter.Add("Ids", ListVM.Ids); } // 为首次加载添加Searcher查询参数 if (ListVM.Searcher != null) { var props = ListVM.Searcher.GetType().GetProperties(); props = props.Where(x => !_excludeTypes.Contains(x.PropertyType)).ToArray(); foreach (var prop in props) { if (!_excludeParams.Contains(prop.Name)) { Filter.Add($"Searcher.{prop.Name}", prop.GetValue(ListVM.Searcher)); } } } } var request = new Dictionary <string, object> { { "pageName", "Searcher.Page" }, //页码的参数名称,默认:page { "limitName", "Searcher.Limit" }, //每页数据量的参数名,默认:limit }; var response = new Dictionary <string, object> { { "statusName", "Code" }, //数据状态的字段名称,默认:code { "statusCode", 200 }, //成功的状态码,默认:0 { "msgName", "Msg" }, //状态信息的字段名称,默认:msg { "countName", "Count" }, //数据总数的字段名称,默认:count { "dataName", "Data" } //数据列表的字段名称,默认:data }; #region 生成 Layui 所需的表头 var rawCols = ListVM?.GetHeaders(); var maxDepth = (ListVM?.ChildrenDepth) ?? 1; var layuiCols = new List <List <LayuiColumn> >(); var tempCols = new List <LayuiColumn>(); layuiCols.Add(tempCols); // 添加复选框 if (!HiddenCheckbox) { var checkboxHeader = new LayuiColumn() { Type = LayuiColumnTypeEnum.Checkbox, LAY_CHECKED = CheckedAll, Rowspan = maxDepth }; tempCols.Add(checkboxHeader); } // 添加序号列 if (!HiddenGridIndex) { var gridIndex = new LayuiColumn() { Type = LayuiColumnTypeEnum.Numbers, Rowspan = maxDepth }; tempCols.Add(gridIndex); } var nextCols = new List <IGridColumn <TopBasePoco> >();// 下一级列头 foreach (var item in rawCols) { var tempCol = new LayuiColumn() { Title = item.Title, Field = item.Field, Width = item.Width, Sort = item.Sort, Fixed = item.Fixed, Align = item.Align, UnResize = item.UnResize, //EditType = item.EditType }; switch (item.ColumnType) { case GridColumnTypeEnum.Space: tempCol.Type = LayuiColumnTypeEnum.Space; break; case GridColumnTypeEnum.Action: tempCol.Toolbar = $"#{ToolBarId}"; break; default: break; } if (item.Children != null && item.Children.Count() > 0) { tempCol.Colspan = item.ChildrenLength; } if (maxDepth > 1 && (item.Children == null || item.Children.Count() == 0)) { tempCol.Rowspan = maxDepth; } tempCols.Add(tempCol); if (item.Children != null && item.Children.Count() > 0) { nextCols.AddRange(item.Children); } } if (nextCols.Count > 0) { CalcChildCol(layuiCols, nextCols, maxDepth, 1); } #endregion #region 处理 DataTable 操作按钮 var actionCol = ListVM?.GridActions; var rowBtnStrBuilder = new StringBuilder(); // Grid 行内按钮 var toolBarBtnStrBuilder = new StringBuilder(); // Grid 工具条按钮 var gridBtnEventStrBuilder = new StringBuilder(); // Grid 按钮事件 if (actionCol != null && actionCol.Count > 0) { var vm = Vm.Model as BaseVM; foreach (var item in actionCol) { if (vm.LoginUserInfo?.IsAccessable(item.Url) == true || item.ParameterType == GridActionParameterTypesEnum.AddRow || item.ParameterType == GridActionParameterTypesEnum.RemoveRow) { // Grid 行内按钮 if (item.ShowInRow) { if (item.ParameterType != GridActionParameterTypesEnum.RemoveRow) { rowBtnStrBuilder.Append($@"<a class=""layui-btn layui-btn-primary layui-btn-xs"" lay-event=""{item.Area + item.ControllerName + item.ActionName + item.QueryString}"">{item.Name}</a>"); } else { rowBtnStrBuilder.Append($@"<a class=""layui-btn layui-btn-primary layui-btn-xs"" onclick=""ff.RemoveGridRow('{Id}',{Id}option,{{{{d.LAY_INDEX}}}});"">{item.Name}</a>"); } } // Grid 工具条按钮 if (!item.HideOnToolBar) { var icon = string.Empty; switch (item.ActionName) { case "Create": icon = @"<i class=""layui-icon""></i>"; break; case "Delete": case "BatchDelete": icon = @"<i class=""layui-icon""></i>"; break; case "Edit": case "BatchEdit": icon = @"<i class=""layui-icon""></i>"; break; case "Details": icon = @"<i class=""layui-icon""></i>"; break; case "Import": icon = @"<i class=""layui-icon""></i>"; break; case "GetExportExcel": icon = @"<i class=""layui-icon""></i>"; break; } toolBarBtnStrBuilder.Append($@"<a href=""javascript:void(0)"" onclick=""wtToolBarFunc_{Id}({{event:'{item.Area + item.ControllerName + item.ActionName + item.QueryString}'}});"" class=""layui-btn layui-btn-sm"">{icon}{item.Name}</a>"); } var url = item.Url; if (item.ControllerName == "_Framework" && item.ActionName == "GetExportExcel") // 导出按钮 接口地址 { url = $"{url}&_DONOT_USE_VMNAME={vmQualifiedName}"; } var script = new StringBuilder($"var tempUrl = '{url}';"); if (SPECIAL_ACTION.Contains(item.ActionName)) { script.Append($@"tempUrl = tempUrl + '&id=' + data.ID;"); } else { switch (item.ParameterType) { case GridActionParameterTypesEnum.NoId: break; case GridActionParameterTypesEnum.SingleId: script.Append($@" if(data==undefined||data==null||data.ID==undefined||data.ID==null){{ var ids = ff.GetSelections('{Id}'); if(ids.length == 0){{ layui.layer.msg('请选择一行'); return; }}else if(ids.length > 1){{ layui.layer.msg('最多只能选择一行'); return; }}else{{ tempUrl = tempUrl + '&id=' + ids[0]; }} }}else{{ tempUrl = tempUrl + '&id=' + data.ID; }} "); break; case GridActionParameterTypesEnum.MultiIds: script.Append($@" isPost = true; var ids = ff.GetSelections('{Id}'); if(ids.length == 0){{ layui.layer.msg('请至少选择一行'); return; }} "); break; case GridActionParameterTypesEnum.SingleIdWithNull: script.Append($@" var ids = []; if(data != null && data.ID != null){{ ids.push(data.ID); }} else {{ ids = ff.GetSelections('{Id}'); }} if(ids.length > 1){{ layui.layer.msg('最多只能选择一行'); return; }}else if(ids.length == 1){{ tempUrl = tempUrl + '&id=' + ids[0]; }} "); break; case GridActionParameterTypesEnum.MultiIdWithNull: script.Append($@" var ids = ff.GetSelections('{Id}'); {(item.ControllerName == "_Framework" && item.ActionName == "GetExportExcel" ? "if(ids.length>0) tempUrl = tempUrl + '&Ids=' + ids.join('&Ids=');" : "isPost = true;")} "); break; default: break; } } gridBtnEventStrBuilder.Append($@" case '{item.Area + item.ControllerName + item.ActionName + item.QueryString}':{{"); if (item.ParameterType == GridActionParameterTypesEnum.AddRow) { gridBtnEventStrBuilder.Append($@"ff.AddGridRow(""{Id}"",{Id}option,{ListVM.GetSingleDataJson(null)}); "); } else if (item.ParameterType == GridActionParameterTypesEnum.RemoveRow) { } else { gridBtnEventStrBuilder.Append($@" var isPost = false; {script} {(string.IsNullOrEmpty(item.OnClickFunc) ? (item.ShowDialog ? $"ff.OpenDialog(tempUrl,'{Guid.NewGuid().ToNoSplitString()}','{item.DialogTitle}',{(item.DialogWidth == null ? "null" : item.DialogWidth.ToString())},{(item.DialogHeight == null ? "null" : item.DialogHeight.ToString())},isPost===true&&ids!==null&&ids!==undefined?{{'Ids':ids}}:undefined);" : (item.Area == string.Empty && item.ControllerName == "_Framework" && item.ActionName == "GetExportExcel" ? $"ff.DownloadExcelOrPdf(tempUrl,'{SearchPanelId}',{JsonConvert.SerializeObject(Filter)});" : $"ff.BgRequest(tempUrl, isPost===true&&ids!==null&&ids!==undefined?{{'Ids':ids}}:undefined);" ) ) : $"{item.OnClickFunc}();")}"); } gridBtnEventStrBuilder.Append($@"}};break; "); } } }