public async Task<IActionResult> Save(TreeNodeInput input) { if (!ModelState.IsValid) return Json(ModelState.GetErrorsInline()); ;
var edit = input.Id.HasValue; var ent = edit ? await mcx.FindAsync<TreeNode>(input.Id) : new TreeNode();
ent.Name = input.Name;
if (!edit) { if (input.ParentId.HasValue) { ent.Parent = await mcx.FindAsync<TreeNode>(input.ParentId); }
mcx.Add(ent); }
await mcx.SaveChangesAsync();
return Json(new { Item = MapNode(ent) }); }
public async Task<IActionResult> Delete(int id) { var node = await mcx.FindAsync<TreeNode>(id);
return PartialView(new DeleteConfirmInput { Id = id, Type = "node", Name = node.Name }); }
[HttpPost] public async Task<IActionResult> Delete(DeleteConfirmInput input) { var node = await mcx.FindAsync<TreeNode>(input.Id); await DeleteNode(node);
await mcx.SaveChangesAsync();
return Json(new { node.Id }); }
public async Task<IActionResult> CrudTree(GridParams g) { var rootsQuery = mcx.TreeNodes.Where(o => o.Parent == null);
var gmb = new GridModelBuilder<TreeNode>(rootsQuery.AsQueryable(), g) { KeyProp = o => o.Id, Map = MapNode };
gmb.GetChildrenAsync = async (node, nodeLevel) => { // non lazy version //var children = result.Where(o => o.Parent == node).ToArray(); //return children.AsQueryable();
var children = mcx.TreeNodes.Where(o => o.Parent == node).AsQueryable();
children = gmb.OrderBy(children);
var count = await children.CountAsync();
// set this node as lazy when it's above level 1 (relative), it has children, and this is not a lazy request already if (nodeLevel > 1 && count > 0 && g.Key == null) return Awe.LazyNode;
return await children.ToArrayAsync(); };
gmb.GetItemAsync = async () => { var id = Convert.ToInt32(g.Key); var node = await mcx.TreeNodes.FirstAsync(o => o.Id == id); return node; };