Asp.net mvc 如何表现友好;“未找到对象”;ASP.NET MVC中的消息(非404)

Asp.net mvc 如何表现友好;“未找到对象”;ASP.NET MVC中的消息(非404),asp.net-mvc,Asp.net Mvc,我正在学习MVC,并使用示例应用程序中的以下示例来展示一本书的详细信息。在代码中,我看到: // GET: Book/Details/5 public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Book book = db.Books.Find(id); if

我正在学习MVC,并使用示例应用程序中的以下示例来展示一本书的详细信息。在代码中,我看到:

// GET: Book/Details/5
public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Book book = db.Books.Find(id);
    if (book == null)
    {
        return HttpNotFound();
    }
    return View(book);
}
如果找不到一本书,代码会强制浏览器显示HTTP错误代码。我们如何返回基于对象上下文的更友好的消息(而不是简单的通用(例如404)页面)

假设已经找到一本书,那么View CSHTML代码相当简单:

@model BookStore.Models.Book
@{
    ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
    <h4>Book</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Name)
        </dt>
    ... rest removed for brevity
</div>
@model BookStore.Models.Book
@{
ViewBag.Title=“详细信息”;
}
细节
书

@DisplayNameFor(model=>model.Name) ... 为简洁起见,去掉其余部分
我们如何将其替换为以下内容:

<h2>No book found</h2>
<p>That book was not found.  Check the ISBN code, or contact an awesome librarian</p>
找不到任何书籍
那本书没有找到。检查ISBN代码,或联系超级图书管理员


像这样的东西怎么样

public class ErrorViewModel
{
    public string Summary { get; set; }
    public string Description { get; set; }
}
然后:


然后,您可以创建一个通用错误视图,并根据需要向其传递任何错误消息。如果需要聚合错误,可以始终修改模型以使用集合而不是单个字符串(或传递
ErrorViewModel
的集合)。

而不是
返回HttpNotFound()您始终可以
返回视图(“NoBook”)
其中
NoBook.cshtml
包含上面的html,如果我有许多问题需要检测,例如没有书籍、没有查看书籍的权限、用户没有提供ISBN等,那么这是否保证每个文件都有一个新的视图?有很多视图/文件!您可以始终拥有一个通用的“错误”视图,并通过视图模型(或ViewBag)传递一些属性(比如“标题”和“消息”),为每个错误定义一个ErrorController和操作方法,并根据错误类型显示适当的视图。检查这个谢谢Ant,这看起来很简单。您能告诉我这与使用
ModelState.AddModelError
有什么不同吗?我假设
AddModelError
只是将一个错误添加到“book”模型中,并显示在“book”视图中?@evidr Yep-模型错误通常作为现有视图模型上的元数据,用于在同一视图中显示验证错误,而您所追求的是自定义错误视图,因此,错误本身实际上成为了一个模型。如果您的错误直接与模型属性相关,您仍然可以认为模型错误是一种有效的方法,但是如果您对这些属性的值不感兴趣,那么我认为这似乎是人为的。非常好,谢谢。今天早些时候实施了你的建议,效果很好。继续努力。
if (book == null)
{
    return View("Error", new ErrorViewModel
        {
            Summary = "No book found",
            Description = "That book was not found.  Check the ISBN code, or contact an awesome librarian"
        }
}