ASP.NET MVC Core NullReferenceException中的嵌套foreach循环

时间:2017-07-27 23:18:15

标签: asp.net-mvc razor asp.net-core-mvc

我试图在一个包含两个主要模型的简单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)行。

如何才能让这个侧边栏在每个页面上都有效?

1 个答案:

答案 0 :(得分:0)

好的,我能够通过更改我的ViewComponent的import commands batcmd = "dir" result = commands.getoutput(batcmd) print result 方法来使用相关集合的预先加载来实现这一点:

GetCategoriesAsync

This Microsoft Doc指出了我正确的方向。