我试图在一个包含两个主要模型的简单Web应用程序中添加导航侧边栏,当我尝试使用嵌套循环在侧边栏中渲染数据时,我遇到了一个特殊的错误
我的应用程序在以下示例中有两个模型,如Category和Thing:
public class Category
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Thing> Things { get; set; }
}
public class Thing
{
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int CategoryID { get; set; }
public virtual Category Category { get; set; }
}
我想添加一个包含所有类别列表的侧边栏。我创建了一个我在_Layout.cshtml中引用的ViewComponent,如下所示:
// SidebarViewComponent.cs
public class SidebarViewComponent : ViewComponent
{
private readonly MyContext db;
public SidebarViewComponent(MyContext context)
{
db = context;
}
public async Task<IViewComponentResult> InvokeAsync()
{
var categories = await GetCategoriesAsync();
return View(categories);
}
private Task<List<Category>> GetCategoriesAsync()
{
return db.Category.ToListAsync();
}
}
// View file for SidebarViewComponent
@model IEnumerable<MyApp.Models.Category>
<div id="sidebar">
@foreach (var category in Model)
{
<div class="header">@category.Name</div>
@foreach (var thing in @category.Things)
{
<div>@thing.Title</div>
}
</div>
}
</div>
// _Layout.cshtml
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewData["Title"]</title>
<!-- Stylesheets -->
<link rel="stylesheet" href="~/css/site.css">
</head>
<body>
@await Component.InvokeAsync("Sidebar")
@RenderBody()
</body>
</html>
当我访问由我的ThingController呈现的页面时,这非常有效。但是在我的主页或CategoryController处理的任何页面上,我得到错误&#34; NullReferenceException:对象引用未设置为对象的实例。&#34;在@foreach (var thing in @category.Things)
行。
如何才能让这个侧边栏在每个页面上都有效?
答案 0 :(得分:0)
好的,我能够通过更改我的ViewComponent的import commands
batcmd = "dir"
result = commands.getoutput(batcmd)
print result
方法来使用相关集合的预先加载来实现这一点:
GetCategoriesAsync
This Microsoft Doc指出了我正确的方向。