Razor页面中foreach循环上的空引用

时间:2018-09-25 08:21:54

标签: asp.net-core razor-pages

编辑:删除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>

2 个答案:

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