在 C# ASP.Net Razor Pages 中将 table 数据显示为列表的最佳方式
Best way to display table data as lists in C# ASP.Net Razor Pages
我正在开发一个项目,用户可以从数据库中 add/edit/delete 一本书并进行预订。基本上是一个图书馆数据库。在我的用户 table(TblUser) 中,我有 userId(PK)、姓名、电子邮件等。在我的书中 table(TblBook) 我有 bookID(PK)、书名、作者等。最后我具有 TblBookStatus,它具有 resID(PK)、bookID、userID 和状态。由于某些项目特定原因,我没有将 bookID 和 userID 作为外键连接。当用户预订一本书时,用户 ID、bookID 和状态已添加为 TblBookStatus table 上的一行。我想做的是,我想显示用户 (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);
}
}
}
}
}
}
我试图将两个 table 都变成列表并检查相交的图书 ID 并制作一个新列表来显示它们,但我收到错误: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>
感谢您的帮助!
在您的构造函数中初始化 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);
}
}
}
}
**(仅建议)您还可以将嵌套的 for 循环替换为 lambda。
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 对象作为参数传递给它,然后从局部视图移动到局部视图内部。
我正在开发一个项目,用户可以从数据库中 add/edit/delete 一本书并进行预订。基本上是一个图书馆数据库。在我的用户 table(TblUser) 中,我有 userId(PK)、姓名、电子邮件等。在我的书中 table(TblBook) 我有 bookID(PK)、书名、作者等。最后我具有 TblBookStatus,它具有 resID(PK)、bookID、userID 和状态。由于某些项目特定原因,我没有将 bookID 和 userID 作为外键连接。当用户预订一本书时,用户 ID、bookID 和状态已添加为 TblBookStatus table 上的一行。我想做的是,我想显示用户 (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);
}
}
}
}
}
}
我试图将两个 table 都变成列表并检查相交的图书 ID 并制作一个新列表来显示它们,但我收到错误: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>
感谢您的帮助!
在您的构造函数中初始化 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);
}
}
}
}
**(仅建议)您还可以将嵌套的 for 循环替换为 lambda。
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 对象作为参数传递给它,然后从局部视图移动到局部视图内部。