如果实体对象为空,则自动从操作方法抛出404异常

时间:2017-02-16 08:46:10

标签: asp.net-mvc entity-framework

例如,我们有简单的操作方法来显示任何具有正确ID的书:

public ActionResult GetBook(int id) // id = 123456789
    {
        var book = dataManager.Books.GetBookById(id); // == null
        logger.Info("Getting book with id " + book.Id);
        return View(book);
    }

如果id参数无效,我们会收到500错误,因为没有带有该ID的图书。

如果我们需要抛出404错误,我们必须手动处理这种情况,如下所示:

if (book == null)
        {
            return HttpNotFound();
        }

对于Web应用程序中的所有操作方法(自定义过滤器,请求管道),是否可以将500错误切换为404错误?

2 个答案:

答案 0 :(得分:2)

从技术上讲,您可以通过安装错误处理程序,将任何500内部服务器错误重写为Application_Error()中的404 Not Found,如ASP.NET MVC 5 error handling中所述。

但是,您似乎想让代码在NullReferenceException中的book上抛出book.Id,并将该异常转换为404.

在这种情况下你真的不应该这样做,因为这会隐藏编程错误,因为你会错过无意中发生这种情况的例外情况。

所以:只需明确地执行此操作 期望null。您展示的代码正是您所需要的:

if (book == null)
{
    return HttpNotFound();
}

答案 1 :(得分:0)

我发现这有用Bulk 301 Redirect

我测试然后抛出302

try
{
  ------
}
catch
{
    throw new HttpException(302, "not found");
}

在Global.asax中捕获异常并查找重定向csv文件

protected void Application_Error()
    {
        Exception exception = Server.GetLastError();

        Response.Clear();
        Server.ClearError();

        HttpException ex = exception as HttpException;

        if (ex.GetHttpCode() == 404 || ex.GetHttpCode() == 302 || ex.GetHttpCode() == 500)
            {
                Redirect code in the link!
            }
    }