Лучший способ отображать данные таблицы в виде списков в C# ASP. Net Razor Pages - PullRequest
0 голосов
/ 25 мая 2020

Я работаю над проектом, в котором пользователи могут добавлять / редактировать / удалять книгу из базы данных и зарезервировать ее. В основном база данных библиотеки. В моей таблице пользователей (TblUser) у меня есть userId (PK), имя, адрес электронной почты и т. Д. c .. В моей таблице книг (TblBook) у меня есть bookID (PK), имя книги, автор и т. Д. c. И, наконец, у меня есть TblBookStatus, у которого есть resID (PK), bookID, userID и status. Я не подключил bookID и userID в качестве внешнего ключа из-за некоторых c причин, связанных с проектом. Когда пользователь резервирует книгу, идентификатор пользователя, идентификатор книги и статус добавляются в виде строки в таблицу TblBookStatus. Я пытаюсь отобразить книги, зарезервированные пользователем (TblBookStatus). вот мой C# код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LibMan.Models.DB;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;

namespace LibMan.Pages
{
    public class LibraryModel : PageModel
    {
        private readonly LibMan.Models.DB.LibManContext _context;
        public string Message { get; set; }
        public LibraryModel(LibMan.Models.DB.LibManContext context)
        {
            _context = context;
        }
        public IList<TblBookStatus> TblBookStatus { get; set; }
        public IList<TblBook> TblBook { get; set; }
        public IList<TblBook> DisplayBook { get; set; }

        public async Task OnGetAsync()
        {
            TblBookStatus = await _context.TblBookStatus.ToListAsync();
            TblBook = await _context.TblBook.ToListAsync();
            foreach(var item in TblBook)
            {
                foreach(var item2 in TblBookStatus)
                {
                    if(item.BookId == item2.BookId)
                    {
                        DisplayBook.Add(item);
                    }
                }
            }
        }
    }
}

Я попытался превратить обе таблицы в списки, проверить пересекающиеся идентификаторы книг и создать новый список для их отображения, но я получил сообщение об ошибке: NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. в строке DisplayBook.Add(item);

Я видел, как люди пишут SQL команды, но я не уверен, должен ли я это делать. Вот сторона HTML

@page
@model LibMan.Pages.LibraryModel
@{
    ViewData["Title"] = "Library";
    Layout = "~/Pages/Shared/_postLoginLayout.cshtml";
}

<h1>Library</h1>

<p>
    <a asp-page="Create">Add a new Book</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Author)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Translator)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Publisher)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Description)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Category)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Status)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TblBook[0].Cover)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.DisplayBook)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Author)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Translator)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Publisher)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Description)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Category)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Status)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Cover)
                </td>
                <td>
                    <a asp-page="./GetBook" asp-route-id="@item.BookId">Get Book</a> |
                    <a asp-page="./Edit" asp-route-id="@item.BookId">Edit</a> |
                    <a asp-page="./Details" asp-route-id="@item.BookId">Details</a> |
                    <a asp-page="./Delete" asp-route-id="@item.BookId">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Спасибо за помощь!

1 Ответ

1 голос
/ 25 мая 2020

Инициализировать список DisplayBook в вашем конструкторе.

public LibraryModel(LibMan.Models.DB.LibManContext context)
        {
            _context = context;
             DisplayBook = new List<TblBook>();
        }

Также добавьте это условие перед циклами for

 if(TblBookStatus!=null && TblBook!=null) 
             {
            foreach(var item in TblBook)
              {
                foreach(var item2 in TblBookStatus)
                {
                    if(item.BookId == item2.BookId)
                    {
                        DisplayBook.Add(item);
                    }
                }
            }
          }

** (только предложение). Вы также можете заменить вложенный для l oop лямбда.

public async Task OnGetAsync()
        {
            TblBookStatus = await _context.TblBookStatus.ToListAsync();
            TblBook = await _context.TblBook.ToListAsync();
            if(TblBookStatus!=null && TblBook!=null) 
            {
              DisplayBook =  TblBook.Where(t=>TblBookStatus.Any(ts=>ts.BookId==t.BookId));
            }
        }

Вы также можете использовать частичное представление, чтобы ваш код бритвы был чистым. Создайте частичное представление и передайте ему объект LibraryModel в качестве параметра и перейдите изнутри этого частичного представления.

...