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

ASP.NET MVC项目图书详情页获取数据返回Null问题求助

ASP.NET MVC 图书详情页空引用问题求助

我正在开发一个ASP.NET MVC项目,通过Gutendex的Web API获取图书数据制作详情页,但遇到了问题:点击首页的Details按钮传递图书ID后,BookRepository.GetBooksById方法返回Null,触发错误“Value cannot be null. Arg_ParamName_Name”。

首页视图代码

@model BookListModel

<div class="col-md-12">
    <div class="row">
        @foreach (var books in Model.results)
        {
            <div class="col-md-3 text-truncate">
                <img src="@books.formats.imagejpeg" alt="...">
                <div class="card-body">
                    <h5 class="card-title">@books.title</h5>
                </div>
                <div class="d-flex justify-content-between align-items-center">
                    <div class="btn-group">
                        <a class="btn btn-primary stretched-link" asp-controller="Book" asp-action="Details" asp-route-id="@books.id">Details</a>
                        <button type="button" class="btn btn-sm btn-outline-secondary">Add</button>
                    </div>
                </div>
                <br />
            </div>
        }
    </div>
</div>

BookRepository类代码

public class BookRepository
{
    private static List<Result> results;
    public static Result GetBooksById(int id)
    {
        return results.FirstOrDefault(b => b.id == id); // 问题发生处
    }
}

Book控制器Details方法

public IActionResult Details(int id)
{
    return View(BookRepository.GetBooksById(id));
}

详情页视图代码

@model Result

<div class="card mb-3">
    <div class="card-body">
        <div class="row no-gutters">
            <div class="col-md-3">
                <img src="@Model.formats.imagejpeg" class="card-img">
            </div>
            <div class="col-md-9">
                <h5 class="card-title">@Model.title</h5>
                <p class="card-text">@Model.subjects</p>
                <p class="card-text">
                    <small class="text-muted">3 days ago</small>
                </p>
            </div>
        </div>
    </div>
</div>

问题原因分析

核心问题是BookRepository中的静态results列表从未被初始化或填充数据。首页显示的图书数据来自API,但这些数据没有被存入results列表,导致调用GetBooksById时results本身就是Null,触发空引用错误。

解决方案

  1. 填充静态列表
    在首页控制器获取API数据的方法中,将返回的图书列表赋值给BookRepository.results:
public async Task<IActionResult> Index()
{
    using var httpClient = new HttpClient();
    var bookList = await httpClient.GetFromJsonAsync<BookListModel>("https://gutendex.com/books/");
    BookRepository.results = bookList.results;
    return View(bookList);
}
  1. 添加空值校验
    在控制器的Details方法中先判断返回结果,避免视图接收Null模型:
public IActionResult Details(int id)
{
    var book = BookRepository.GetBooksById(id);
    if (book == null)
    {
        return NotFound(); // 返回404页面
    }
    return View(book);
}
  1. 视图空值保护
    在详情页视图中增加空值判断,防止Null引用:
@model Result

@if (Model != null)
{
<div class="card mb-3">
    <div class="card-body">
        <div class="row no-gutters">
            <div class="col-md-3">
                <img src="@Model.formats?.imagejpeg" class="card-img" alt="@Model.title">
            </div>
            <div class="col-md-9">
                <h5 class="card-title">@Model.title</h5>
                <p class="card-text">@(Model.subjects != null ? string.Join(", ", Model.subjects) : "")</p>
                <p class="card-text">
                    <small class="text-muted">3 days ago</small>
                </p>
            </div>
        </div>
    </div>
</div>
}
else
{
    <p>未找到该图书</p>
}
  1. 优化Repository设计(可选)
    静态列表在多用户场景下存在线程安全问题,建议改用依赖注入将Repository设计为非静态类,或使用缓存机制存储图书数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:10:31