编辑:删除 @page
Index.cshtml 中的注释修复了问题。
调用页面时出现错误:
System.NullReferenceException: Object reference not set to an instance of an object. at AspNetCore.Views_Inspector_Inspect.get_Model()
这是由这一行引起的:@foreach (var rule in Model.Items)
果然,在调试时,我看到 Model
确实为空。
但我使用所需的对象来调用此 View ,如下所示:return View(res);
此外,使用 DisplayTextFor 获取模型数据,如下所示: <h2>@Html.DisplayTextFor(model => model.CardNumber)</h2>
确实有效并显示正确的数据。
我在这里做错了什么?
完整代码如下。
Controller :
public IActionResult Inspect() {
var res = GetDataObject();
return View(res);
}
检查.cshtml:
@page
@model mynamespace.DataObject
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
text-align: left;
}
</style>
<h2>@Html.DisplayTextFor(model => model.SomeItem)</h2> <!-- THIS WORKS -->
<table class="table" style="width: 50%">
<thead>
<tr>
<th>Header1</th>
<th>Header2</th>
<th>Header3</th>
<th>Header4</th>
</tr>
</thead>
<tbody>
@foreach (var rule in Model.SomeCollection) <!-- Model is null -->
{
<tr>
<td>
@Html.DisplayTextFor(modelItem => rule.Name)
</td>
</tr>
<tr>
<td>
@Html.DisplayTextFor(modelItem => rule.Name)
</td>
</tr>
<tr>
<td>
@Html.DisplayTextFor(modelItem => rule.Name)
</td>
</tr>
<tr>
<td>
@Html.DisplayTextFor(modelItem => rule.Name)
</td>
</tr>
<tr>
<td>
@Html.DisplayTextFor(modelItem => rule.Name)
</td>
</tr>
}
</tbody>
</table>
</p>
最佳答案
根据评论。
此问题的解决方案是删除 @page
关键字。
@page
的作用是指定它是 Razor 页面。
您的困惑在于您认为 Razor 页面与 Razor 语法相同。
.cshtml 文件扩展名指定该文件可以具有 Razor 语法,但这并不意味着它是 Razor 页面。
MVC 和 Razor Pages 遵循不同的命名约定,在 Startup.cs 文件中设置不同,并且将使用不同的文件夹结构。
例如,Index.cshtml
razor 页面将从 Index.cshtml.cs
文件方法 Get()
获取其模型,该方法将返回一个页面(模型)
。
发生错误是因为 razor 页面不需要 Controller 提供任何内容,它不应该由 Controller 提供服务。
关于asp.net-core - Razor 页面中 foreach 循环的空引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493655/