65.9K
CodeProject 正在变化。 阅读更多。
Home

MVC 应用程序 - 第二部分 - 错误显示

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.50/5 (3投票s)

2010年7月6日

CPOL

4分钟阅读

viewsIcon

28223

downloadIcon

263

一个演示 MVC 错误显示的应用程序。

介绍 - 第 2 部分 - 错误显示

这是由几个部分组成的文章的第 2 部分,展示如何使用 MVC 编写应用程序。 第 1 部分 展示了创建 EntityFramework 数据库、控制器、视图和一些验证的使用。 第 2 部分展示了错误显示。 在几篇文章中,我们将编写一个应用程序,展示 MVC 的多个方面和 MVC 中的各种功能。

背景

我开始这样做是因为 MVC 是新的,我想学习它,因为我知道这将是一项伟大的技术。 你只需要了解一些 C#,而且当我深入研究一些技术时,其他 MVC 文章会有所帮助。 我目前不会深入研究什么是控制器和视图,因为有很多文章在这方面做得很好。

Using the Code

当发生错误时,我们希望显示我们的错误页面,而不是像这样的标准黄色屏幕

unhandled screen

我搜索了尝试找到一个好的方法来处理错误,并找到了一个托管我想要内容的好的 URL,所以大部分内容都归功于 这个 网站。 助手目录中的文件 "HandleErrorWithMINOAttribute.cs" 是该文件的简化版本。

public override void OnException(ExceptionContext context)
{
    // 
    // Invoke the base implementation first.
    // This should mark context.ExceptionHandled = true 
    // which stops ASP.NET from producing
    // a "yellow screen of death." This also sets the 
    // Http StatusCode to 500 (internal server error.)
    //
    // Assuming Custom Errors aren't off,
    // the base implementation will trigger the application 
    // to ultimately render the "Error" view from one of the following locations:
    //
    //      1. ~/Views/Controller/Error.aspx
    //      2. ~/Views/Controller/Error.ascx
    //      3. ~/Views/Shared/Error.aspx
    //      4. ~/Views/Shared/Error.ascx
    // 
    // "Error" is the default view, however,
    // a specific view may be provided as an Attribute property.
    // A notable point is the Custom Errors
    // defaultRedirect is not considered in the redirection plan.
    //
    base.OnException(context);

    var e = context.Exception;
    LogException(e);
}

我向代码中添加了一个 "LogException",这样我们就可以看到发生的错误。 在我们想要调用的每个控制器方法之前,我们将向其添加此属性。 我们还希望告诉错误发生时要转到哪个视图。 我们可以通过在属性中指定视图来做到这一点。 您可以在下面的代码片段中看到这一点。

[HandleErrorWithMINO(ExceptionType = typeof(System.Data.UpdateException), 
 View = "UpdateError")]
[HandleErrorWithMINO(ExceptionType = typeof(System.Data.ConstraintException), 
 View = "ConstraintError")]
public ActionResult Create([Bind(Exclude = "Emp_Id")]Employee empins)

上面的代码的作用是,当发生 System.Data.UpdateException 类型的错误时,将调用视图 UpdateError。 没有 ExceptionType 的属性将调用默认视图,我们将在 web.config 中设置该视图。 试用顺序将如上所述。 将首先查看控制器目录以查看该视图是否存在,然后搜索共享目录。 现在,请记住,这些是未处理的异常。 因此,如果您处理它们,将不会显示默认视图。 然后,您必须显示您希望用户看到的视图。

现在,如果您想捕获一个错误,然后根据一些逻辑调用一个特定的视图,您可以专门调用它。 建议之一是拥有您自己的错误代码,然后根据需要抛出您需要的错误代码。 下面的示例演示了如何使用标准异常来实现此目的。

// for showing purpose trigger a specific view 
if (Emp_Ins_toEdit.Emp_City != "Boston")
{
    throw new System.Data.ConstraintException("Not Boston");
    return View("");
}

现在,要实际查看错误视图,您必须启用它们。 这已经让我好几次了,我在添加视图后从未看到它们。 这些被称为自定义视图。 它们默认未启用;要查看它们,您必须将以下内容添加到 web.config 文件中。 我将此内容放在 "system.web" 部分之后,以便于查看和更改。

<customErrors mode="On" defaultRedirect="ErrorPage.htm" >
  <error statusCode="404" redirect="404filenotfound.htm" />
</customErrors>

该部分的作用是告诉系统启用自定义错误,并且默认重定向现在指向一个名为 "ErrorPage.htm" 的页面。 您还可以添加许多额外的行,这些行将针对每个特定错误进行重定向,例如 404 或另一个错误。 例如,当应用程序出现 404 错误时,它将被重定向到一个名为 "404filenotfound.htm" 的页面。 关于默认重定向的一个关键部分是,它基于 web.confg 所在的位置。 如果您将文件放在另一个目录中,则必须基于该目录。

此时,您应该能够触发一个错误,例如添加一个具有相同名字、中间名和姓氏的员工,这将触发一个错误。 这应该会给出一个 UpdateException 并显示 UpdateError.aspx。 您应该看到以下页面

handled screen

关注点

不显示标准黄色屏幕非常重要。 您需要能够向用户显示一个更好的错误显示,以便他们和客户支持人员能够理解。 此外,能够将错误记录到文件中,以便以后阅读,以便您可以看到发生的一系列错误,这一点非常重要。 如果您想使用开源解决方案而不是编写自己的解决方案,我强烈推荐 elmah,因为我的文章基于它。 我编写这个是为了代替使用 elmah,只是为了了解错误系统。 我可能会在稍后使用 elmah,随着我进一步开发应用程序; 现在,我想学习。

历史

  • 2010 年 6 月 28 日 - 初始版本。
© . All rights reserved.