I am using Kendo Treelist ie: Load on Demand in our application. I'm using the 2017.1.223 version for kendo. Applied server side filtering for my treelist.
When I try to apply filter to my columns, the result shows me duplicate records. Posting my code below:
Controller method
------------------------------------------------
public async Task<JsonResult> GetAssetTreeListBasedOnPermissions([DataSourceRequest] DataSourceRequest request, AssetColumnFilters assetcolumnFilters,int? id)
{
try
{
string searchExpression = string.Empty;
AssetColumnFilters columnFilters = new AssetColumnFilters();
if (!string.IsNullOrEmpty(assetcolumnFilters.AssetId))
{
var assetIds = assetcolumnFilters.AssetId.ToString().Split(',');
var i = 0;
var assetString = "";
foreach (var assetId in assetIds)
{
if (i == 0)
{
assetString += " (A.AssetId=" + assetId + ") ";
}
else if (i > 0)
{
assetString += " OR (A.AssetId=" + assetId + ") ";
}
i++;
}
searchExpression = assetString;
}
string searchExp = searchExpression;
AssetFiltersModel filters = new AssetFiltersModel();
long? companyId = SiteSession.CurrentSession.CompanyId;
long userId = SiteSession.CurrentSession.UserId;
//FIRST TIME LOAD
if (id==null && request.Filters.Count==0)
searchExp = string.IsNullOrEmpty(searchExp) ? " (SA.ParentAssetId=" + 0 + " AND A.CompanyId=" + SiteSession.CurrentSession.CompanyId + ")" : "(SA.ParentAssetId=" + 0 + " AND A.CompanyId=" + SiteSession.CurrentSession.CompanyId + ") and " + searchExp;
else if(id==null&& request.Filters.Count>0)
searchExp = string.IsNullOrEmpty(searchExp) ? " (A.CompanyId=" + SiteSession.CurrentSession.CompanyId + ")" : "(A.CompanyId=" + SiteSession.CurrentSession.CompanyId + ") and " + searchExp;
else
searchExp = string.IsNullOrEmpty(searchExp) ? " (SA.ParentAssetId=" + id + " AND A.CompanyId=" + SiteSession.CurrentSession.CompanyId + ")" : "(SA.ParentAssetId=" + id + " AND A.CompanyId=" + SiteSession.CurrentSession.CompanyId + ") and " + searchExp;
filters.SearchExpression = searchExp;
filters.SortExpression = (request.Sorts.Count > 0) ? request.Sorts.FirstOrDefault().Member : string.Empty;
filters.SortDirection = (request.Sorts.Count > 0) ? (request.Sorts.FirstOrDefault().SortDirection == ListSortDirection.Ascending ? " asc" : " Desc") : string.Empty;
filters.StartIndex = Helper.GetCurrentPage(request.Page, request.PageSize);
filters.PageSize = request.PageSize;
filters.UserId = userId;
var assetGridList = await aladdinRestClient.PostAsync<AssetFiltersModel, AssetListModel>(Constant.GETASSETLISTBASEDONUSER, filters, false);
var list= assetGridList.AssetList.AsQueryable();
var result = list
.Select(e => new AssetModel
{
AssetId = e.AssetId,
ParentAssetId = e.ParentAssetId,
AssetName = e.AssetName,
AssetIdEncrypt = e.AssetIdEncrypt,
hasChildren = e.IsParent == 1 ? true : false,
AssetNo = e.AssetNo,
Model = e.Model,
SerialNumber = e.SerialNumber,
Category1Name = e.Category1Name,
Category2Name = e.Category2Name,
Category3Name = e.Category3Name,
Category4Name = e.Category4Name,
LocationLevel1Name = e.LocationLevel1Name,
LocationLevel2Name = e.LocationLevel2Name,
LocationLevel3Name = e.LocationLevel3Name,
LocationLevel4Name = e.LocationLevel4Name,
StatusName = e.StatusName,
IsAttachmentsExist = e.IsAttachmentsExist
}).ToTreeDataSourceResult(request,
e => e.AssetId,
e => e.ParentAssetId
);
var jsonResult = Json(result, JsonRequestBehavior.AllowGet);
jsonResult.MaxJsonLength = Int32.MaxValue;
return jsonResult;
}
catch (Exception ex)
{
throw ex;
}
}
View
---------------------------------------------------------------------------
@(Html.Kendo().TreeList<AssetModel>()
.Name("assetTreeList")
.Columns(columns =>
{
columns.Add().Field(a => a.AssetId).Hidden(true);
columns.Add().Field(a => a.AssetIdEncrypt).Hidden(true);
//.Template("#if(IsAttachmentsExist == true) {#" + "<a class='k-button' href='javascript:void(0);' onclick='EditAsset(#:AssetId#,true);'><span class='k-i-attachment-45 k-i-clip-45'></span>#= AssetName# </a>" + "#}else {#" + "<a class='inline-link' href='javascript:void(0);' onclick='EditAsset(#:AssetId#,true);' style='margin-right:5px;'>#= AssetName# </a>" + "#} #").Width(290);
columns.Add().Field(a => a.AssetName).TemplateId("attachment-template").Width(290)/*.HeaderTemplateId("expandAll-template")*/;
columns.Add().Field(a => a.AssetNo).Title(AssetDetailResource.AssetNumber).Width(250).Hidden((bool)ViewData["AssetNumber"]);
columns.Add().Field(a => a.Model).Title(AssetDetailResource.Model).Width(120).Hidden((bool)ViewData["Model"]);
columns.Add().Field(a => a.SerialNumber).Title(AssetDetailResource.SerialNumber).Width(150).Hidden((bool)ViewData["SerialNumber"]);
columns.Add().Field(a => a.LocationLevel1Name).Title(AssetDetailResource.LocationLevel1Name).Width(180).Hidden((bool)ViewData["LocationLevel1"]);
columns.Add().Field(a => a.LocationLevel2Name).Title(AssetDetailResource.LocationLevel2Name).Width(180).Hidden((bool)ViewData["LocationLevel2"]);
columns.Add().Field(a => a.LocationLevel3Name).Title(AssetDetailResource.LocationLevel3Name).Width(180).Hidden((bool)ViewData["LocationLevel3"]);
columns.Add().Field(a => a.LocationLevel4Name).Title(AssetDetailResource.LocationLevel4Name).Width(180).Hidden((bool)ViewData["LocationLevel4"]);
columns.Add().Field(a => a.Category1Name).Title(AssetDetailResource.Category1).Width(180).Hidden((bool)ViewData["CategoryLevel1"]);
columns.Add().Field(a => a.Category2Name).Title(AssetDetailResource.Category2).Width(180).Hidden((bool)ViewData["CategoryLevel2"]);
columns.Add().Field(a => a.Category3Name).Title(AssetDetailResource.Category3).Width(180).Hidden((bool)ViewData["CategoryLevel3"]);
columns.Add().Field(a => a.Category4Name).Title(AssetDetailResource.Category4).Width(180).Hidden((bool)ViewData["CategoryLevel4"]);
columns.Add().Field(a => a.StatusName).Title(@SGE.Aladdin.Resources.SGEAdmin.AdminResources.Status).Width(120).Hidden((bool)ViewData["Status"]);
//if (IsAdd)
//{
// columns.Add().Template("<a href='javascript:void(0);' onclick='CloneAsset(#:AssetId#);' class='duplicate-ico' title='" + string.Format(CommonResources.CloneTooltip, CommonResources.Assets) + "'>" + "</a>").Title(CommonResources.Clone).Width(50);
//}
if (IsDelete)
{
columns.Add().Template("<a href='javascript:void(0);' onclick='DeleteAsset(#:AssetId#);' class='delete-ico' title='" + string.Format(CommonResources.DeleteTooltip, CommonResources.Assets) + "'>" + "</a>").Title(CommonResources.Delete).Width(50);
}
})
.Sortable()
.Events(ev => ev.DataBound("onTreeListDataBound"))
.Events(ev => ev.FilterMenuInit("filterMenuInit"))
.DataSource(dataSource => dataSource
.Read(read => read.Action("GetAssetTreeListBasedOnPermissions", "Asset"))
.ServerOperation(true)
.Model(m =>
{
m.Id(e => e.AssetId);
m.ParentId(e => e.ParentAssetId);
m.Field(e => e.AssetName);
})
)
.Filterable(true)
.Reorderable(true)
.Resizable(true)
.Scrollable(true)
.Sortable(true)
)
In the above code, when a column filter is applied, I am getting the entire data in 'list' variable. When this list of data is converted to treedatasourceresult, the filter will get applied to the data. In the result variable, I can see the filtered results with duplicates. Please see the attached image. Based on the filter, the result should return asset 05, ASSET 01=>ASSET 008. But now its showing as in the attached image, which is incorrect. Could you please help me? Your help will be much appreciated.