c# - NullReferenceException:对象引用未设置为 ASP.NET MVC 中的对象错误的实例
问题描述
我是 ASP.NET MVC 的新手,我得到了
“NullReferenceException:对象引用未设置为对象的实例”
尝试显示数据库中的数据时出现异常。我有这样连接的Movies
和Reviews
表:
public class Movie
{
public int MovieId { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public virtual ICollection<Review> Reviews { get; set; }
}
public class Review
{
#region Review Properties
[Key]
public int ReviewId { get; set; }
[Required(ErrorMessage = "Comment can't be empty.")]
public string Comment { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime Date { get; set; }
#endregion
#region Dependencies
[ForeignKey("Id")]
public int MovieId { get; set; }
public Movie Movie { get; set; }
#endregion
}
上下文文件如下所示:
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext()
{
}
public MvcMovieContext(DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<Movie> Movies { get; set; }
public DbSet<Review> Reviews { get; set; }
}
}
我需要在详细信息视图中显示每部电影的评论,因此我创建了一个可以正常工作的评论添加部分(评论已添加到数据库中)。现在,当我尝试显示当前电影的评论时,我在 View 文件中使用了以下代码:
@foreach (Review review in Model.Reviews)
{
<div class="container">
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-8">
<div>
<p>@review.Comment</p>
<small class="pull-right">@review.Date</small>
</div>
</div>
</div>
</div>
<hr />
}
另外我应该提到该视图使用此模型:@model MvcMovie.Models.Movie
并且Reviews controller
看起来像这样:
public class ReviewsController : Controller
{
private readonly MvcMovieContext _context = new MvcMovieContext();
public ReviewsController(MvcMovieContext context)
{
_context = context;
}
public ActionResult New(Review review)
{
if (ModelState.IsValid)
{
try
{
review.Date = DateTime.Now;
_context.Reviews.Add(review);
_context.SaveChanges();
TempData["message"] = "Your review was added.";
}
catch (Exception)
{
}
}
return Redirect("/Movies/Details/" + review.MovieId.ToString());
}
}
Movies 控制器(仅将数据传递给视图的 Details 部分)如下所示:
namespace MvcMovie.Controllers
{
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movies
.FirstOrDefaultAsync(m => m.MovieId == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
}
}
异常出现在该 @foreach (Review review in Model.Reviews)
行上,所以我猜Model.Reviews
是不知何故NULL
,但我不知道为什么会发生这种情况,因为评论表不是空的。对此有何建议?
解决方案
尝试修复您的详细信息操作:
var movie = await _context.Movies.Include(r=>r.Reviews)
.FirstOrDefaultAsync(m => m.MovieId == id);
.....
并为防止将来出现此错误,请修复视图代码
@if ( Model.Reviews!=null)
{
@foreach (Review review in Model.Reviews)
{
....
}
}
推荐阅读
- c++ - Protobuf:如果赋予枚举的值在枚举集中不存在怎么办?
- ffmpeg - 如何使用 ffmpeg 录制视频和音频帧
- python - 无法使用线程化 FlaskAPI 显示 PyQt5 GUI
- ssl - 为什么在固定无效的中间证书但有效的叶(服务器)证书时 tls 证书验证失败?
- javascript - html2canvas 和 justgage 的问题
- c++ - 多线程时c ++中的访问冲突异常
- regex - 正则表达式从字符的最后一次出现到数字或 [
- c++ - 理解错误默认定义是不正确的
- django - 转换为 Bootstrap 后表单不起作用
- c# - 在构建时使用 SlowCheetah 对 App.config 进行 C# 转换不起作用