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

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

System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в 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>
0
Tomer Something 25 Сен 2018 в 11:21

2 ответа

Лучший ответ

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

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

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

Ваше замешательство в том, что вы думаете, что страница Razor совпадает с синтаксисом Razor.

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

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

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

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

1
Anton Toshik 25 Сен 2018 в 09:22

Для тех, кто использует Razor Pages, оставьте @page вверху и верните IActionResult.

    public IActionResult OnGet(string id)
    {
        ID = id;
        return Page();
    }

Обратите внимание, что тип возврата - IActionResult, но фактический возврат имеет тип Page (). За кулисами страница возвращается с привязкой к модели. Это похоже на:

return MyPage(this);
0
Aaron Bar 4 Окт 2019 в 19:19