Поскольку плагин Multi-Select Drop Down Tree ожидает структуру данных, как показано ниже:
[
{
id: 0,
title: 'Item 1 '
},
{
id: 1,
title: 'Item 2',
subs: [
{
id: 10,
title: 'Item 2-1'
},
]
},
]
Я создаю новый класс DTO
для хранения данных:
public class CategoryDto{
public int Id { get; set; }
public string Title { get; set; }
public int? ParentId { get; set; }
public IList<CategoryDto> Subs{ get; set; }
}
Мы можем преобразовать IList<Category>
в IList<CategoryDto>
и затем встроить их в деревья CategoryDto:
public static class CategoryExtensions
{
public static IList<CategoryDto> BuildTrees(this IList<Category> categories)
{
var dtos = categories.Select(c => new CategoryDto {
Id = c.CategoryID,
Title = c.CategoryName,
ParentId = c.ParenetCategoryID,
}).ToList();
return BuildTrees( null, dtos);
}
private static IList<CategoryDto> BuildTrees(int? pid, IList<CategoryDto> candicates)
{
var subs = candicates.Where(c => c.ParentId== pid).ToList();
if (subs.Count() == 0) {
return new List<CategoryDto>(); // required an empty list instead of a null !
}
foreach (var i in subs) {
i.Subs= BuildTrees(i.Id, candicates);
}
return subs;
}
}
Теперь мы можем использовать метод расширения для построения деревьев в методе действия FillDropDown
:
public async Task<IActionResult> FillDropdown()
{
var categories= await _context.Category.ToListAsync();
var trees = categories.BuildTrees();
return new JsonResult(trees);
}
Наконец, используйте ajax, чтобы загрузить его и установить категории:
$(document).ready(function ($) {
$.ajax({
url: "/category/filldropdown",
type: "Get",
data: "",
dataType: "json",
cache: false,
success: function (data) {
$('#justAnInputBox').comboTree({
source:data,
isMultiple:false,
});
},
error: function (data) {
}
})
});
Я использую следующие данные для его проверки:
CategoryId CategoryName ParentCategoryID
1 choice 1 NULL
2 choice 2 NULL
3 choice 3 NULL
4 choice 4 NULL
5 choice 2.1 2
6 choice 2.2 2
7 choice 2.3 2
8 choice 2.2.1 6
9 choice 2.2.2 6
10 choice 2.2.3 6
И он работает безупречно: