You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Modal弹窗无法正确显示数据库对应图书数据记录问题求助

问题解决:图书详情模态框始终显示第一条记录的问题

问题根源

你当前代码中所有模态框的ID均为#exampleModal,Bootstrap查找模态框时只会匹配第一个拥有该ID的元素,因此无论点击哪个按钮,都会弹出第一条记录的模态框。

针对你提到的通过SelectedBook()方法获取对应图书并返回至模态框的需求,以下提供两种可行解决方案:


方案一:为每本图书生成唯一ID的模态框

直接在视图中为每本图书创建独立模态框,每个模态框使用包含图书ID的唯一标识:

修改 Overview.cshtml(注:你代码中写的Index.cshtml应为笔误)

@using myBooks.Models

<div class="card-columns">
    <div class="row row-cols-1 row-cols-md-3 g-4">
        @foreach (Book book in ViewBag.Books)
        {
            <div class="col">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">@book.Title</h5>
                    </div>
                    <div class="card-footer">
                        <!-- 按钮目标ID绑定图书唯一标识 -->
                        <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal-@book.Id">
                            Details
                        </button>

                        <!-- 模态框ID包含图书ID -->
                        <div class="modal fade" id="exampleModal-@book.Id" tabindex="-1" aria-labelledby="exampleModalLabel-@book.Id" aria-hidden="true">
                            <div class="modal-dialog">
                                <div class="modal-content">
                                    <div class="modal-header">
                                        <h1 class="modal-title fs-5" id="exampleModalLabel-@book.Id">@book.Title</h1>
                                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                                    </div>
                                    <div class="modal-body">
                                        @book.Description
                                        <p>ISBN: @book.ISBN</p>
                                    </div>
                                    <div class="modal-footer">
                                        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
                                        <button type="button" class="btn btn-primary">Save changes</button>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        }
    </div>
</div>

该方案无需修改控制器,直接在视图层完成,适合数据量较小的场景。


方案二:通过AJAX调用控制器方法动态加载详情

保留单个模态框模板,点击按钮时异步调用控制器方法获取对应图书数据并填充:

步骤1:修改BookController,添加SelectedBook方法

using Microsoft.AspNetCore.Mvc;
using myBooks.Data;
using myBooks.Models;

namespace myBooks.Controllers
{
    public class BookController : Controller
    {
        private readonly AppDbContext _appDbContext;

        public BookController(AppDbContext appDbContext)
        {
            _appDbContext = appDbContext;
        }

        public IActionResult Overview()
        {
            var books = _appDbContext.Books.ToList();
            ViewBag.Books = books;
            return View();
        }

        // 返回图书详情的JSON数据
        [HttpGet]
        public IActionResult SelectedBook(int bookId)
        {
            var bookInDb = _appDbContext.Books.Find(bookId);
            if (bookInDb == null)
            {
                return NotFound();
            }
            return Json(bookInDb);
        }
    }
}

步骤2:修改Overview.cshtml,实现AJAX填充逻辑

@using myBooks.Models

<div class="card-columns">
    <div class="row row-cols-1 row-cols-md-3 g-4">
        @foreach (Book book in ViewBag.Books)
        {
            <div class="col">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">@book.Title</h5>
                    </div>
                    <div class="card-footer">
                        <!-- 按钮绑定图书ID属性 -->
                        <button type="button" class="btn btn-primary btn-book-details" data-book-id="@book.Id">
                            Details
                        </button>
                    </div>
                </div>
            </div>
        }
    </div>
</div>

<!-- 通用模态框模板 -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h1 class="modal-title fs-5" id="exampleModalLabel"></h1>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <p id="book-description"></p>
                <p id="book-isbn"></p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
                <button type="button" class="btn btn-primary">Save changes</button>
            </div>
        </div>
    </div>
</div>

<script>
// 确保页面已引入Bootstrap 5的bootstrap.bundle.min.js文件
document.querySelectorAll('.btn-book-details').forEach(button => {
    button.addEventListener('click', function() {
        const bookId = this.getAttribute('data-book-id');
        // 调用控制器接口获取数据
        fetch(`/Book/SelectedBook?bookId=${bookId}`)
            .then(response => {
                if (!response.ok) {
                    throw new Error('图书不存在');
                }
                return response.json();
            })
            .then(book => {
                // 填充模态框内容
                document.getElementById('exampleModalLabel').textContent = book.title;
                document.getElementById('book-description').textContent = book.description;
                document.getElementById('book-isbn').textContent = `ISBN: ${book.iSBN}`;
                // 显示模态框
                const modal = new bootstrap.Modal(document.getElementById('exampleModal'));
                modal.show();
            })
            .catch(error => {
                alert(error.message);
            });
    });
});
</script>

该方案适合数据量大或需要动态更新数据的场景,减少页面初始加载的DOM元素数量。


内容的提问来源于stack exchange,提问作者Boarderadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:54:52