首页 > 解决方案 > 不将数据列表返回到 ASP.NET Core MVC 中的索引视图中

问题描述

我正在使用 ASP.NET Core MVC 对我自己的网站进行编程,并按照我想要迭代从我的数据库填充到视图的数据的视频教程之一。以下是代码:

存储库

public class ChoreBearRepository : IChoreBearRepo
{
    private readonly DatabaseContext _context;
    public ChoreBearRepository(DatabaseContext context)
    {
        _context = context;
    }

    /*
    This methods returns all categories from the database using the background thread.
    */
    public async Task<List<CategoryofTask>> GetAllCategories()
    {
        return await _context.categoryOfTasks
            .Select(category => new CategoryofTask(){
                CategoryName = category.CategoryName,
                CategoryDesc = category.CategoryDesc,
                CategoryID = category.CategoryID,
                CategoryImageURL = category.CategoryImageURL,
                CategoryRate = category.CategoryRate
            }).ToListAsync();
    }
}

控制器:

public class HomeController: Controller
{
    private readonly IChoreBearRepo _repository;

    public HomeController(IChoreBearRepo repository)
    {
       _repository = repository;
    }

    // public IActionResult Index()
    // {
    //     return View();
    // }

    [HttpGet]
    public async Task<IActionResult> Index()
    {
        var data = await _repository.GetAllCategories();
        return View(data);
    }
}

索引.cshtml

@page
@model IEnumerable<ChoreBear_Website.Models.CategoryofTask>

<div class="row">
    @foreach (var category in Model)
    {
        <partial name="Categories" model=@Model/>
    }
</div>

部分视图 (Categories.cshtml)

@model CategoryofTask

<div class="card" style="width: 18rem;">
    <img class="card-img-top" src="@Model.CategoryImageURL" alt="Card image cap">
    <div class="card-body">
        <h5 class="card-title">@Model.CategoryName</h5>
        <p class="card-text">@Model.CategoryDesc</p>
        <a href="#" class="btn btn-primary">Go somewhere</a>
    </div>
</div>

该列表包含来自数据库的数据,但网站项目向我返回了一个错误,即:

NullReferenceException:对象引用未设置为对象的实例。MyApp.Namespace.Home.Views_Home_Index.get_Model()

我确实知道列表为空,这就是为什么我想知道我应该在哪里初始化列表。我按照视频教程中的代码示例进行操作。

PS:我按照这个视频教程从数据库中获取数据列表

标签: c#asp.net-coreentity-framework-coreasp.net-core-mvc

解决方案


您的代码看起来可以检索列表并将其返回到 VIEW“索引”,即使该列表为空,因为数据库中没有记录。

但是,有两个问题。您的 Index.cshtml 有一个“@page”指令,这意味着它现在是 Razor 页面而不是视图,并希望在 Index.cshtml.cs 后面的页面或同一页面的 @code 部分中找到模型。这是你错误的根源。

此外,在下文中,您将 IEnumerable 作为模型传递给部分视图,该部分视图需要一个单独的 CategoryOfTask ...

@model IEnumerable<ChoreBear_Website.Models.CategoryofTask>

<div class="row">
    @foreach (var category in Model)
    {
        <partial name="Categories" model=@Model/>
    }
</div>

试试换...

<partial name="Categories" model=@Model/>

到 ...

<partial name="Categories" model=@category/>

要了解 Razor 视图和页面之间的区别,请参阅此链接:

https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-5.0&tabs=visual-studio

前面的代码看起来很像在带有控制器和视图的 ASP.NET Core 应用程序中使用的 Razor 视图文件。使它与众不同的是@page 指令。@page 使文件成为一个 MVC 动作——这意味着它直接处理请求,而不通过控制器。@page 必须是页面上的第一个 Razor 指令。@page 影响其他 Razor 构造的行为。Razor 页面文件名具有 .cshtml 后缀。


推荐阅读