从 Razor Pages 中的数据库模型填充 TreeView
Populating a TreeView from a database model in Razor Pages
我有一个 Razor 页面项目试图从使用数据模型创建的数据库填充 Kendo TreeView(或任何其他 TreeView)。
这些是模型的相关字段:
namespace FliveRetry.Models
{
public class Org
{
public int ID { get; set; }
public string OrgName { get; set; }
public int? ParentID { get; set; }
public bool? HasChildren { get; set; }
}
}
这是视图调用:
@(Html.Kendo().DropDownTree()
.Name("selectedOrgs")
.DataTextField("Org")
.DataValueField("OrgID")
.Checkboxes(true)
.DataSource(d => d
.Read(read =>
read.Url("/Apps/Edit?handler=Read")
)
)
)
在 OnGetRead 中将值硬编码到如下所示的列表中工作正常:
public IActionResult OnGetRead(int? id)
{
var data = new List<Org>()
{
new Org() { ID = 1, ParentID = null, HasChildren = true, OrgName = "Org1" },
new Org() { ID = 2, ParentID = null, HasChildren = false, OrgName = "Org2" },
new Org() { ID = 3, ParentID = 1, HasChildren = true, OrgName = "Org3" },
new Org() { ID = 4, ParentID = 3, HasChildren = false, OrgName = "Org4" }
};
var result = data.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new {
id = item.ID,
Org = item.OrgName,
hasChildren = item.HasChildren
});
return new JsonResult(result);
}
}
Hard Coded Values Image
我正在尝试循环遍历 Org 集合,以使用数据库中的 Org 填充树视图。
将 for 循环放在 List 声明中到处都会产生错误,OnGetRead 本身表示并非所有代码路径 return 一个值:
public IActionResult OnGetRead(int? id)
{
var blnChildren = false;
var data = new List<Org>()
{
foreach (var item in _context.Org)
{
blnChildren = false;
if (item.ParentID.Equals(null))
{
blnChildren = true;
}
new Org() { ID = item.ID, ParentID = item.ParentID, HasChildren = blnChildren, OrgName = item.OrgName };
}
};
var result = data.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new {
id = item.ID,
Org = item.OrgName,
hasChildren = item.HasChildren
});
return new JsonResult(result);
}
如果我将 for 循环放在列表声明之外,循环会正确填充但结果为空,我猜是因为项目声明在列表之外?
public IActionResult OnGetRead(int? id)
{
var blnChildren = false;
var data = new List<Org>()
{
};
foreach (var item in _context.Org)
{
blnChildren = false;
if (item.ParentID.Equals(null))
{
blnChildren = true;
}
new Org() { ID = item.ID, ParentID = item.ParentID, HasChildren = blnChildren, OrgName = item.OrgName };
}
var result = data.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new {
id = item.ID,
Org = item.OrgName,
hasChildren = item.HasChildren
});
return new JsonResult(result);
}
不确定我的问题是与 C# 相关还是与模型相关,但我们将不胜感激。
如果我走错了路,任何其他从 Razor 项目而非 MVC 项目中的数据库模型工作的自引用树视图的工作示例也会有所帮助。
我有另一个使用 Kendo.Mvc.UI.TreeViewItemModel 数据的相同问题的示例,我无法在硬编码之外工作,我只需要任何真正有效的版本。
谢谢堆
很多东西需要改正。
- 在 forach 循环中,您每次都遍历数据库中的每个 Org table 项,从而创建对数据库的查询。那是浪费时间和资源。你应该首先从数据库中查询你需要的所有项目,然后处理它们。如果您需要所有 table 条目,您可以将它们具体化。
var orgs = _context.Org.ToArray();
foreach(var item in orgs)
{
//code here
- 您没有在 foreach 循环内将项目添加到数据列表中。你可以这样做
var tmpOrg = new Org() { code code code} ;
data.Add(tmpOrg);
- 这整个事情可以简化为一个表达式。您不需要实现整个 table,也不需要那个 foreach 循环。您可以更改结果表达式以使用 _context.Org 而不是数据。在 hasChildren 的 Select 子句中,您只需更改此行
hasChildren = item.ParentID == null ? true : false;
编辑
你应该剩下的是
public IActionResult OnGetRead(int? id)
{
var result = _context.Org.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new
{
OrgID = item.ID,
Org = item.OrgName,
HasChildren = item.ParentID == null ? true : false
});
return new JsonResult(result);
}
我有一个 Razor 页面项目试图从使用数据模型创建的数据库填充 Kendo TreeView(或任何其他 TreeView)。
这些是模型的相关字段:
namespace FliveRetry.Models
{
public class Org
{
public int ID { get; set; }
public string OrgName { get; set; }
public int? ParentID { get; set; }
public bool? HasChildren { get; set; }
}
}
这是视图调用:
@(Html.Kendo().DropDownTree()
.Name("selectedOrgs")
.DataTextField("Org")
.DataValueField("OrgID")
.Checkboxes(true)
.DataSource(d => d
.Read(read =>
read.Url("/Apps/Edit?handler=Read")
)
)
)
在 OnGetRead 中将值硬编码到如下所示的列表中工作正常:
public IActionResult OnGetRead(int? id)
{
var data = new List<Org>()
{
new Org() { ID = 1, ParentID = null, HasChildren = true, OrgName = "Org1" },
new Org() { ID = 2, ParentID = null, HasChildren = false, OrgName = "Org2" },
new Org() { ID = 3, ParentID = 1, HasChildren = true, OrgName = "Org3" },
new Org() { ID = 4, ParentID = 3, HasChildren = false, OrgName = "Org4" }
};
var result = data.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new {
id = item.ID,
Org = item.OrgName,
hasChildren = item.HasChildren
});
return new JsonResult(result);
}
}
Hard Coded Values Image
我正在尝试循环遍历 Org 集合,以使用数据库中的 Org 填充树视图。
将 for 循环放在 List 声明中到处都会产生错误,OnGetRead 本身表示并非所有代码路径 return 一个值:
public IActionResult OnGetRead(int? id)
{
var blnChildren = false;
var data = new List<Org>()
{
foreach (var item in _context.Org)
{
blnChildren = false;
if (item.ParentID.Equals(null))
{
blnChildren = true;
}
new Org() { ID = item.ID, ParentID = item.ParentID, HasChildren = blnChildren, OrgName = item.OrgName };
}
};
var result = data.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new {
id = item.ID,
Org = item.OrgName,
hasChildren = item.HasChildren
});
return new JsonResult(result);
}
如果我将 for 循环放在列表声明之外,循环会正确填充但结果为空,我猜是因为项目声明在列表之外?
public IActionResult OnGetRead(int? id)
{
var blnChildren = false;
var data = new List<Org>()
{
};
foreach (var item in _context.Org)
{
blnChildren = false;
if (item.ParentID.Equals(null))
{
blnChildren = true;
}
new Org() { ID = item.ID, ParentID = item.ParentID, HasChildren = blnChildren, OrgName = item.OrgName };
}
var result = data.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new {
id = item.ID,
Org = item.OrgName,
hasChildren = item.HasChildren
});
return new JsonResult(result);
}
不确定我的问题是与 C# 相关还是与模型相关,但我们将不胜感激。
如果我走错了路,任何其他从 Razor 项目而非 MVC 项目中的数据库模型工作的自引用树视图的工作示例也会有所帮助。
我有另一个使用 Kendo.Mvc.UI.TreeViewItemModel 数据的相同问题的示例,我无法在硬编码之外工作,我只需要任何真正有效的版本。
谢谢堆
很多东西需要改正。
- 在 forach 循环中,您每次都遍历数据库中的每个 Org table 项,从而创建对数据库的查询。那是浪费时间和资源。你应该首先从数据库中查询你需要的所有项目,然后处理它们。如果您需要所有 table 条目,您可以将它们具体化。
var orgs = _context.Org.ToArray();
foreach(var item in orgs)
{
//code here
- 您没有在 foreach 循环内将项目添加到数据列表中。你可以这样做
var tmpOrg = new Org() { code code code} ;
data.Add(tmpOrg);
- 这整个事情可以简化为一个表达式。您不需要实现整个 table,也不需要那个 foreach 循环。您可以更改结果表达式以使用 _context.Org 而不是数据。在 hasChildren 的 Select 子句中,您只需更改此行
hasChildren = item.ParentID == null ? true : false;
编辑
你应该剩下的是
public IActionResult OnGetRead(int? id)
{
var result = _context.Org.Where(x => id.HasValue ? x.ParentID == id : x.ParentID == null)
.Select(item => new
{
OrgID = item.ID,
Org = item.OrgName,
HasChildren = item.ParentID == null ? true : false
});
return new JsonResult(result);
}