【问题标题】:How to join database tables in my website?如何在我的网站中加入数据库表?
【发布时间】:2021-08-12 20:33:46
【问题描述】:

这是我的代码:

albums.cshtml

@page
@using Project.Models
@model Project.Pages.AlbumsModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Albums</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Album ID</th>
                <th>Artist ID</th>
                <th>Artist name</th>
                <th>Album title</th>
                <th></th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (Album album in Model.Albums)
            {
                <tr>
                    <td>@album.AlbumId</td>
                    <td>@album.ArtistId</td>
                    <td>@Html.DisplayFor(modelArtists => album.Artist.Name)</td>
                    <td>@album.Title</td>
                    <td><a asp-page="/Albums/Details" asp-route-id="@album.AlbumId">Details</a></td>
                    <td><a asp-page="/Albums/Edit" asp-route-id="@album.AlbumId">Edit</a></td>
                    <td><a asp-page="/Albums/Delete" asp-route-id="@album.AlbumId">Delete</a></td>   
                    <td><a asp-page="/Albums/AlbumTracks" asp-route-id="@album.AlbumId">Tracks</a></td>       
                </tr>
            }
        </tbody>
    </table>
</div>
<div class="row">
    <p>Enter a title & ArtistID for a new album:&nbsp;</p>
    <form method="POST">
        <div><input asp-for="Album.Title" /></div>
        <div><input asp-for="Album.ArtistId" /></div>
        <input type="submit" />
    </form>
</div>
<div>
    <a asp-page="/Index">Home</a>
</div>

AlbumTracks.cshtml

@page
@using Project.Models
@model Project.Pages.AlbumTracksModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Tracks</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Track name</th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (Track track in Model.Tracks)
            {
                <tr>
                    <td>@track.TrackId</td>
                    <td>@track.Name</td>
                </tr>
            }
        </tbody>
    </table>
</div>
@* <div class="row">
    <p>Enter a name & TrackID for a new track:&nbsp;</p>
    <form method="POST">
        <div><input asp-for="Track.Name" /></div>
        <div><input asp-for="Track.TrackId" /></div>
        <input type="submit" />
    </form>
</div> *@
<div>
    <a asp-page="/Index">Home</a>
</div>

AlbumTracks.cshtml.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Project.Models;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Project.Pages
{
    public class AlbumTracksModel : PageModel
    {
        private Chinook db;

        public AlbumTracksModel(Chinook injectedContext)
        {
            db = injectedContext;
        }
        public IEnumerable<Track> Tracks { get; set; }
        public void OnGetAsync()
        {
            ViewData["Title"] = "Chinook Web Site - Tracks";
            Tracks = db.Tracks.Include(a => a.Album);
        }
    }
}

目前,我在 AlbumTracks.cshtml 中显示每个专辑中的所有曲目,而不仅仅是用户在 album.cshtml 中选择的曲目。我已经反复阅读this,但我正在努力找出 AlbumTracks.cshtml 的语法,也许我需要在 AlbumTracks.cshtml.cs 中添加更多内容?

我想也许我需要使用这样的东西来加入表格:

        if (item.AlbumID == Model.AlbumID)

请指点一下? TIA。

编辑:GitHub repo

【问题讨论】:

    标签: c# asp.net entity-framework asp.net-core razor-pages


    【解决方案1】:

    目前,我在 AlbumTracks.cshtml 中显示每张专辑的所有曲目,而不仅仅是用户在 album.cshtml 中选择的曲目。

    你确定你描述的是正确的吗?您可以使用以下代码显示所有专辑中的所有曲目:

    Tracks = db.Tracks.Include(a => a.Album);
    

    我想你想要的是当你点击albums.cshtml中的Tracks链接时可以显示所选专辑的曲目:

    <td><a asp-page="/Albums/Album Tracks" asp-route-id="@album.AlbumId">Tracks</a></td>
    

    如果我说的是正确的,你需要先将id 参数添加到你的/Albums/AlbumTracks 方法并修改linq,如下所示:

    public class AlbumTracksModel : PageModel
    {
        private Chinook db;
    
        public AlbumTracksModel(Chinook injectedContext)
        {
            db = injectedContext;
        }
        public IEnumerable<Track> Tracks { get; set; }
    
        public void OnGetAsync(int id)
        {
            ViewData["Title"] = "Chinook Web Site - Tracks";
            Tracks = db.Tracks.Include(a => a.Album).Where(a=>a.AlbumId==id);
        }
    }
    

    专辑曲目.cshtml:

    @page
    @using Project.Models
    @model Project.Pages.AlbumTracksModel
    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    
    <div class="row">
        <h1 class="display-2">Tracks</h1>
        <table class="table">
            <thead class="thead-inverse">
                <tr>
                    <th>Track name</th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th></th>
                </tr>
            </thead>
    
            <tbody>
                @foreach (Track track in Model.Tracks)
                {
                    <tr>
                        <td>@track.TrackId</td>
                        <td>@track.Name</td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
    

    结果:

    【讨论】:

    • 谢谢,但这里有一件或多件事情我不太明白。 IDK 你的意思是'你确定你描述的是正确的吗? AlbumTracks.cshtml 页面明确显示了所有专辑中的所有曲目。我已经用Tracks = db.Tracks.Where(a=&gt;a.AlbumId == id).Include(a =&gt; a.Album); 更新了 AlbumTracks.cshtml.cs。那是表连接,对吗?但是现在如何让所选专辑的曲目列表实际显示在 AlbumTracks.cshtml 上?我不知道使用什么语法。 github.com/double-happ1ness/chinook
    • 这是表连接。你是什​​么意思不知道使用什么语法?只需在后端使用 Tracks = db.Tracks.Where(a=&gt;a.AlbumId == id).Include(a =&gt; a.Album); 就足够了。而您的客户端使用:@foreach (Track track in Model.Tracks)Tracks 这里匹配后端Tracks。也就是说它将读取后端数据并将其显示在您的 AlbumTracks.cshtml 中。你在你的项目中尝试过吗?
    • 我已经更新了 AlbumTracks.cshtml。其实它和你的一样。我想你可能没有时间在你的项目中测试我的代码。
    • 啊,太棒了,非常感谢。我一开始并没有看到与Tracks = db.Tracks.Include(a =&gt; a.Album).Where(a=&gt;a.AlbumId==id); 的区别。我以为我的版本只是在做同样的事情,但由于某种原因,我不清楚它不是。再次感谢。
    【解决方案2】:

    也许可以试试:

    foreach (var track in Model.Tracks)
    {
        if(item.AlbumID == Model.AlbumID)
        {
             <tr>
                  <td>@track.TrackId</td>
                  <td>@track.Name</td>
             </tr> 
        }
    }
    

    您可以发布您的模型吗?

    我的应用中有类似的东西,我创建了 2 个模型,例如1 个用于曲目,1 个用于专辑。 然后在您的专辑模型中创建一个列表 Tracklist 并在您的轨道模型中创建一个属性 AlbumId。 在您的轨道控制器中,创建轨道后,您可以拥有类似

    var albums = _context.Albums.toList // or any other way to retrieve the albums from the DB. 
    foreach (var item in albums)
    if (track.AlbumId = item.Id)
    {
         item.Tracklist.add(Track)
    }
    

    我对此还是有点陌生​​,所以希望这可行!

    【讨论】:

    • 谢谢,但由于某种原因,这给了我错误“当前上下文中不存在名称 'track'”。当您说模型时,您是指实体文件吗?专辑.cs & Track.cs?还是上下文文件 Chinook.cs?
    • 我又试了一次,但这次我得到'名称'item'在当前上下文中不存在'&''AlbumTracksModel'不包含'AlbumId'的定义并且没有可以找到接受“AlbumTracksModel”类型的第一个参数的可访问扩展方法“AlbumId”'
    • 您能否发布一个指向您的 github 存储库或源代码的链接?我的意思是将Id添加到album.cs,将AlbumId添加到Track.cs。然后在包管理器控制台中执行:添加迁移和更新数据库。这会将列添加到您的数据库中,接下来清空您的数据库并用新的测试数据填充它,并通过将每个曲目的 AlbumId 设置为专辑的相应 ID 将曲目与其专辑链接,如果这有帮助,请告诉我
    • GitHub 存储库位于 github.com/double-happ1ness/chinook 。需要明确的是,AlbumId 已经作为 Album 表的主键和 Tracks 表的外键存在,所以我几乎完全可以肯定,不需要对数据库进行任何进一步的处理。现在我正在用Tracks = db.Tracks.Where(a=&gt;a.AlbumId == id).Include(a =&gt; a.Album); '提取'我需要的数据。我认为这是正确的,因为登录页面使用id 作为参数。但是,如何让曲目实际显示在 AlbumTracks.cshtml 页面上?
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多