实体框架.find(id)NullReferenceException
本文关键字:NullReferenceException id 框架 find 实体 | 更新日期: 2023-09-27 18:19:30
我正在学习MVC音乐商店教程,遇到了一个小问题/查询。
我想按id找一张专辑。
var album = db.Albums.Find(id)
然而,这很好,如果id不存在,那么当控制器将null模型传递给视图时,我会得到一个NullReferenceException。
我能想出两种方法来解决这个问题。
方法1:检查控制器中是否为null,如果为null,则显示不同的视图/重定向到不同的操作,如索引页或专用错误页/404未找到页。
//
// GET: /Store/Details/4
public ActionResult Details(int? id)
{
var album = db.Albums.Find(id);
if (album == null) return RedirectToAction("Index");
else return View(album);
}
方法2:检查视图中的模型是否为null,如果为null,则不显示特定于模型的项,而是显示一条错误消息。
@model MvcMusicStore.Models.Album
@{
ViewBag.Title = "Details";
}
@if (Model == null)
{
<h2>That album doesn't exist</h2>
}
else
{
<h2>Details: @Model.Title</h2>
}
问题:是否有其他方法/最佳实践方法来处理此问题?方法1和方法2有什么优点吗?
您可以编写一个自定义操作过滤器,检查传递给视图的模型是否为null,并呈现404页面。这样,您就不需要在所有控制器操作中重复此逻辑:
public class CheckForEmptyModelAttribute: ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var viewResult = filterContext.Result as ViewResultBase;
if (viewResult != null && viewResult.Model == null)
{
var view404 = new ViewResult
{
ViewName = "~/Views/Shared/404.cshtml"
};
filterContext.Result = view404;
}
}
}
然后:
//
// GET: /Store/Details/4
[CheckForEmptyModel]
public ActionResult Details(int? id)
{
var album = db.Albums.Find(id);
return View(album);
}
另一种方法是通过从Route
类派生来编写自定义路由,在该类中检索模型,如果找不到模型,则与路由不匹配。
//
// GET: /Store/Details/4
public ActionResult Details(int? id)
{
var album = db.Albums.Find(id);
return ViewIfNotNull(album);
}
// boxing
private ActionResult ViewIfNotNull(object model)
{
if (album == null) return RedirectToAction("Index");
else return View(album);
}
// OR generic
private ActionResult ViewIfNotNull<T>(T model)
{
if (album == null) return RedirectToAction("Index");
else return View(album);
}