У меня есть следующая структура:
ReportGroup (которая имеет обнуляемую ParentReportGroup), и у каждой группы отчетов есть дочерние отчеты. Я хочу отображать группы отчетов как папки и отчеты как элементы. Примерно так:
//ReportGroupA
//|__>ReportGroupB
// |___>ReportA
// |___>ReportB
//|__>ReportC
//ReportGroupC
//|__>ReportD
et c
Я использую локальную привязку, но с удовольствием меняю при необходимости.
вот вид:
@(Html.Kendo().TreeView()
.Name("treeview-left")
.BindTo((IEnumerable<ReportGroup>)ViewBag.inline, (NavigationBindingFactory<TreeViewItem> mappings) =>
{
mappings.For<ReportGroup>(binding => binding.ItemDataBound((item, category) =>
{
item.Text = category.Name;
item.Id = category.ID.ToString();
item.HtmlAttributes.Add("class", "reportgroup");
if (category.Content != null)
{
item.ImageUrl = Url.Action("ShowReportGroupImage", "Image", new { id = category.ID, size = 1 });
}
}).Children(category => category.ChildGroups)/*.Children(category => category.Reports)*/);
mappings.For<ReportGroupViewModel>(binding => binding.ItemDataBound((item, rcategory) =>
{
item.Text = rcategory.Name;
item.Id = rcategory.ID.ToString();
item.HtmlAttributes.Add("class", "reportgroup");
if (rcategory.Content != null)
{
item.ImageUrl = Url.Action("ShowReportGroupImage", "Image", new { id = rcategory.ID, size = 1 });
}
}).Children(category => category.Reports));
mappings.For<Report>(binding => binding.ItemDataBound((item, subCategory) =>
{
item.Text = subCategory.Name;
item.Id = subCategory.ID.ToString();
item.HtmlAttributes.Add("class", "reportitem");
}));
})
)
Вот встроенный контроллер, который создает ViewBag.Inline:
private IEnumerable<ReportGroup> Local_Data_Binding_Get_Inline_Data()
{
var user = (from u in db.Users
where u.UserName == User.Identity.Name
select u).First();
var reportGroups = (from rg in db.ReportGroups
where rg.ParentGroup_ID == null
select rg).Include("Reports").ToList();
foreach (var rg in reportGroups)
{
rg.ChildGroups = (from _rg in db.ReportGroups.Include("Reports")
where _rg.ParentGroup_ID == rg.ID
select new ReportGroupViewModel
{
Name = _rg.Name,
Content = _rg.Content,
ContentType = _rg.ContentType,
FileName = _rg.FileName,
ID = _rg.ID,
Reports = _rg.Reports,
SequenceNumber = _rg.SequenceNumber
}).ToList();
}
List<ReportGroup> inline = reportGroups;
return inline;
}