Рендеринг частичных представлений: несоответствие модели и проблема DataViewDictionary (Razor Page / ASP. NET CORE) - PullRequest
0 голосов
/ 04 марта 2020

Программист-любитель возвращается сюда с еще несколькими глупыми вопросами для вас, замечательные люди. Пожалуйста, извините за невежество с моей стороны, когда вы просматриваете мой код, он, вероятно, не так чист, как некоторые из вас, профессионалы, хотели бы, чтобы это было.

Я делаю все возможное, чтобы следовать за удивительным мистером Скоттом Алленом ASP. Net основные руководства на веб-странице Pluralsight. Однажды я успешно прошел через него, и теперь снова прошёл через него, адаптируя его под приложение, которое я хотел создать. Я застрял на части курса (module6, video6), где страница бритвы, содержащая некоторые данные SQL в базовой таблице c HTML, изменена, чтобы перечислить каждую запись БД в качестве частичного представления. Для этого в FOREACH l oop используется вспомогательный тег HTML, которому в качестве параметров передается частичное имя макета и модель. На каждой итерации каждая отдельная запись в БД отображается в своем частичном представлении в главном представлении. Проблема, с которой я сталкиваюсь при запуске приложения, заключается в том, что при загрузке главной страницы и достижении foreach l oop на самой первой итерации происходит сбой и выдается ошибка «Необработанное исключение». Ниже я приложил все усилия, чтобы включить все фрагменты кода, которые вам, ребята, нужно будет проанализировать, но еще раз извините за мое невежество, если чего-то не хватает. Пожалуйста, дайте мне знать, если есть, и я включу его сразу.

MAIN VIEW-List.cs html:

@page
@model ListModel
@{
    ViewData["Title"] = "Containers";
}
<h1>Containers</h1>
<form method="get">
    <div class="form-group">
        <div class="input-group">
            <input type="search" class="form-control"
                   asp-for="SearchTerm" />
            <span class="input-group-btn">
                <button class="btn btn-default">
                    <i class="glyphicon glyphicon-search"></i>
                </button>
            </span>
        </div>
    </div>
</form>
@foreach (var container in Model.Containers)
    {
        <partial name="_Summary" @model="container"/>
    }
<a asp-page="./Edit" class="btn btn-primary"> Add New</a>
@section footer {
    <div>@Model.Message</div>
}

MAINVIEW-List.cs html .cs :

namespace FreightPush.Pages.Containers
{
    public class ListModel : PageModel
    {
        private readonly IConfiguration config;
        private readonly IContainerData containerData;
        public string Message { get; set; }
        public IEnumerable<Container> Containers { get; set; }
        [BindProperty(SupportsGet = true)]
        public string SearchTerm { get; set; }
        public ListModel(IConfiguration config, IContainerData containerData)
        {
            this.config = config;
            this.containerData = containerData;
        }
        public void OnGet()
        {
            Message = config["Message"];
            Containers = containerData.GetContainersByNumber(SearchTerm);
        }
    }
}

PARTIALVIEW-_Summary.cs html:

@using FreightPush.Core
@model Container
<div class="card">
    <div class="panel-heading">
        <h3>Container Number: @Model.Number</h3>
    </div>
    <div class="card-body">
        <span>Container Type: @Model.ContainerType</span>
        <span>Client: @Model.Client</span>
    </div>
    <div class="card-footer">
        <a class="btn btn-lg"
           asp-page="./Detail"
           asp-route-containerId="@Model.Id">
            <i class="fa fa-search-plus"></i>
        </a>
        <a class="btn btn-lg"
           asp-page="./Edit"
           asp-route-containerId="@Model.Id">
            <i class="fa fa-edit"></i>
        </a>
        <a class="btn btn-lg"
           asp-page="./Delete"
           asp-route-containerId="@Model.Id">
            <i class="fa fa-trash"></i>
        </a>
    </div>
</div>

Ошибка, которую я получаю при первом итере FOREACH l oop внутри list.cs html:

InvalidOperationException: элемент модели, передаваемый в ViewDataDictionary, имеет тип 'FreightPu sh .Pages.Containers.ListModel', но для этого экземпляра ViewDataDictionary требуется элемент модели из введите 'FreightPu sh .Core.Container'.

Вот то, что я знаю до сих пор, основываясь на некоторых очень обширных исследованиях inte rnet по этому вопросу:

  1. Я могу подтвердить, что я НЕ устанавливаю модель на своей странице _layout.
  2. Я знаю, что Контейнеры - это IENumerable и что модель моей _Summary-страницы - это один Контейнер, и я видел, как несколько человек на онлайн-форумах указывали, что это самая распространенная ошибка. ОДНАКО, разве это не цель foreach l oop и его объявленный переменный контейнер? На моем интерактивном отладчике контейнер работает отлично, и все соответствующие поля заполняются из моей SQL БД.
  3. Если я правильно понял то, что я исследовал, то из того, что я понял, реальный виновник заключается в том, что viewdatadictionary разделен между представлениями. Однако я не могу найти нигде в inte rnet, который показывает мне правильный синтаксис для передачи данных вида в качестве параметра, и intellisense не помогает. Можно ли вообще исправить проблему с параметром view-data?

Большое спасибо, ребята, за вашу помощь! Этот веб-сайт делает мир лучше для одного инженера-любителя за раз!

...