gpt4 book ai didi

c# - Entity Framework .find(id) NullReferenceException

转载 作者:行者123 更新时间:2023-11-30 20:56:52 24 4
gpt4 key购买 nike

我正在处理 MVC Music Store tutorial ,并遇到了一个小问题/查询。

我想通过它的 id 查找相册。

var album = db.Albums.Find(id)

这工作正常,但是,如果 id 不存在,那么当 Controller 将 null 模型传递给 View 时,我会得到一个 NullReferenceException。

我可以想到 2 种方法来解决这个问题。

方法 1:检查 Controller 中是否为 null,如果为 null,则显示不同的 View /重定向到不同的操作,例如索引页面或专用错误页面/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:检查 View 中的模型是否为空,如果是,则不显示模型特定项,而是显示错误消息。

@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 相比有什么优势吗?

最佳答案

您可以编写一个自定义操作过滤器来检查传递给 View 的模型是否为空并呈现 404 页面。这样您就不需要在所有 Controller 操作中重复此逻辑:

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 类来编写自定义路由,您将在其中检索模型,如果未找到,则不匹配路由。

关于c# - Entity Framework .find(id) NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17262697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com