Нулевая ссылка на цикл foreach в Razor Page - PullRequest
0 голосов
/ 25 сентября 2018

РЕДАКТИРОВАТЬ: удаление аннотации @page в Index.cshtml устранило проблему.

При вызове страницы я получаю сообщение об ошибке:

System.NullReferenceException: Objectссылка не установлена ​​на экземпляр объекта.at AspNetCore.Views_Inspector_Inspect.get_Model ()

Что вызвано этой строкой: @foreach (var rule in Model.Items) Достоверно, при отладке я вижу, что Model действительно нулевой.

НоЯ называю это представление, используя нужный объект, например так: 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>

1 Ответ

0 голосов
/ 25 сентября 2018

Согласно комментарию.

Решением этой проблемы является удаление ключевого слова @page.

То, что делает @page, указывает, что это страница бритвы.

Ваша путаница заключается в том, что вы думаете, что Razor Page является тем же синтаксисом Razor.

Расширения файла .cshtml указывают, что файл может иметь синтаксис Razor, это не означает, что это страница Razor.

MVC и Razor Pages следуют другому соглашению об именах, настроены по-разному в файле Startup.cs и будут использовать другую структуру папок.

Например, страница бритвы Index.cshtml получит свою модель из Index.cshtml.cs file method Get(), который возвращает Page(model).

Ошибка возникает из-за того, что страница бритвы ничего не ожидает от контроллера, она не предназначена для обслуживания одним из них.

...