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);