Razor 页面中 foreach 循环的空引用
Null reference on foreach loop in Razor Page
编辑:删除 Index.cshtml 中的 @page
注释修复了问题。
调用页面时出现错误:
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
确实是null.
但我使用所需的对象调用此视图,如下所示:return View(res);
此外,像这样使用 DisplayTextFor 获取模型数据:<h2>@Html.DisplayTextFor(model => model.CardNumber)</h2>
确实有效并显示正确的数据。
我做错了什么?
完整代码如下。
控制器:
public IActionResult Inspect() {
var res = GetDataObject();
return View(res);
}
Inspect.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()
获取模型,这将 return 一个 Page(model)
.
错误发生是因为剃刀页面不期望来自控制器的任何东西,它不应该由控制器提供。
对于那些使用 Razor Pages 的用户,将@page 留在顶部,return IActionResult。
public IActionResult OnGet(string id)
{
ID = id;
return Page();
}
注意 return 类型是 IActionResult,但实际 return 是 Page() 类型。在幕后,页面 return 绑定了模型。它似乎等同于:
return MyPage(this);
编辑:删除 Index.cshtml 中的 @page
注释修复了问题。
调用页面时出现错误:
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
确实是null.
但我使用所需的对象调用此视图,如下所示:return View(res);
此外,像这样使用 DisplayTextFor 获取模型数据:<h2>@Html.DisplayTextFor(model => model.CardNumber)</h2>
确实有效并显示正确的数据。
我做错了什么?
完整代码如下。
控制器:
public IActionResult Inspect() {
var res = GetDataObject();
return View(res);
}
Inspect.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()
获取模型,这将 return 一个 Page(model)
.
错误发生是因为剃刀页面不期望来自控制器的任何东西,它不应该由控制器提供。
对于那些使用 Razor Pages 的用户,将@page 留在顶部,return IActionResult。
public IActionResult OnGet(string id)
{
ID = id;
return Page();
}
注意 return 类型是 IActionResult,但实际 return 是 Page() 类型。在幕后,页面 return 绑定了模型。它似乎等同于:
return MyPage(this);