c# - 不将数据列表返回到 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:我按照这个视频教程从数据库中获取数据列表
解决方案
您的代码看起来可以检索列表并将其返回到 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 后缀。
推荐阅读
- c - 在调试期间将十六进制解释为字符串
- erlang - 如何在 Elixir 中表示大数字
- gmail - Google 电子邮件标记未在邮件中显示事件
- r - 在 stargazer() 中报告回归边际效应
- node.js - 有没有办法处理NodeJS中的Cannot GET错误?
- c++ - 如何更改使用 plstream::stripc 创建的图例中的文本间距
- flutter - 如何在 Flutter 的屏幕顶部加载更多内容?
- python-3.x - 如何列出在虚拟环境中安装到 pip 的软件包?
- javascript - 封装 React 应用程序的最佳方式是什么?
- javascript - 如何从输入值复制 div 和递增标签