Asp.net mvc 如何表现友好;“未找到对象”;ASP.NET MVC中的消息(非404)
我正在学习MVC,并使用示例应用程序中的以下示例来展示一本书的详细信息。在代码中,我看到: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
// 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"
}
}