编辑:删除Index.cshtml中的@page
注释可解决此问题。
呼叫页面时出现错误:
System.NullReferenceException:对象引用未设置为对象的实例。 在AspNetCore.Views_Inspector_Inspect.get_Model()
这是由以下行引起的:@foreach (var rule in Model.Items)
果然,在调试时,我发现Model
确实为空。
但是我使用所需的对象调用此视图,如下所示:return View(res);
此外,像这样使用<h2>@Html.DisplayTextFor(model => model.CardNumber)</h2>
来使用DisplayTextFor获取模型数据确实可以并显示正确的数据。
我在这里做什么错了?
下面的完整代码。
控制器:
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>
答案 0 :(得分:1)
根据评论。
解决此问题的方法是删除@page
关键字。
@page
所做的是表明它是剃刀页面。
您的困惑是您认为Razor Page与Razor语法相同。
.cshtml文件扩展名指定文件可以具有Razor语法,但这并不意味着它是Razor页面。
MVC和Razor页面遵循不同的命名约定,在Startup.cs文件中的设置不同,并且将使用不同的文件夹结构。
例如,一个Index.cshtml
剃刀页面将从Index.cshtml.cs
文件方法Get()
获取其模型,该方法将返回Page(model)
。
发生此错误是因为剃须刀页面不希望控制器提供任何东西,也不意味着可以由一个人提供。
答案 1 :(得分:0)
对于使用Razor页面的用户,请在顶部保留@page并返回IActionResult。
public IActionResult OnGet(string id)
{
ID = id;
return Page();
}
请注意,返回类型为IActionResult,但实际的返回类型为Page()。在幕后,返回带有模型绑定的页面。它似乎等同于:
return MyPage(this);