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,触发空引用错误。
解决方案
- 填充静态列表
在首页控制器获取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); }
- 添加空值校验
在控制器的Details方法中先判断返回结果,避免视图接收Null模型:
public IActionResult Details(int id) { var book = BookRepository.GetBooksById(id); if (book == null) { return NotFound(); // 返回404页面 } return View(book); }
- 视图空值保护
在详情页视图中增加空值判断,防止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> }
- 优化Repository设计(可选)
静态列表在多用户场景下存在线程安全问题,建议改用依赖注入将Repository设计为非静态类,或使用缓存机制存储图书数据。
内容的提问来源于stack exchange,提问作者Manggo
相关产品推荐
相关产品推荐

