c# - Entity Framework .find(id) NullReferenceException

标签 c# asp.net-mvc entity-framework razor nullreferenceexception

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

我想通过 id 查找相册。

var album = db.Albums.Find(id)

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

我可以想出两种方法来解决这个问题。

方法1:检查 Controller 中是否为空,如果为空,则显示不同的 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是否为空,如果是,则不显示特定于模型的项,而是显示错误消息。

@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/

相关文章:

c# - 在整个 Controller 中调用任何操作时是否可以调用方法?

c# - 如何对 session 值进行单元测试?

entity-framework - EF 的列名无效

c# - 优先使用mysql数据库的 Entity Framework

c# - 创建 TransactionScope 并创建 Context order

c# - DateTime.CompareTo 实际返回什么整数?

c# - ASP.NET Web API 登录方法

c# - 自动重新连接到互联网

C# 位图图像、字节数组和流!

asp.net-mvc - 如何从 ASP.NET MVC 默认成员模型中获取用户电子邮件地址?