【问题标题】:ASP.NET Custom Error Page for Web App that uses a Master Page使用母版页的 Web 应用程序的 ASP.NET 自定义错误页
【发布时间】:2014-02-19 16:57:16
【问题描述】:

参考KB306355: How to create custom error reporting pages in ASP.NET by using Visual C# .NET

我了解如何创建自定义错误页面。有很多如何做到这一点的例子,就像上面的链接一样。

我找到的示例都没有显示我所追求的。

我有一个使用母版页的 Web 应用程序。

在我的母版页中,我有一个标签控件,用于显示所有页面都会看到的错误:

<h4 id="bannerError"><asp:Label ID="lblError" runat="server" /></h4>

在该母版页后面的代码中,我有这个:

public void Page_Error(object sender, EventArgs e) {
  var err = Server.GetLastError().GetBaseException();
  ErrorMessage = String.Format("URL {0}: {1} Error: {2}", Request.Url, err.GetType(), err.Message);
  Server.ClearError();
}

public string ErrorMessage {
  get { return lblError.Text; }
  set {
    LogError(value);
    lblError.Text = value;
  }
}

ErrorMessage 是一个属性。我的其他页面可以轻松访问它,并且我可以轻松编辑掉有关将错误写入服务器数据库的部分。

Web.config页面配置(sn-p):

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <customErrors defaultRedirect="Default.aspx" mode="On">
      <error statusCode="403" redirect="Default.aspx" />
      <error statusCode="404" redirect="Default.aspx" />
    </customErrors>
  </system.web>
</configuration>

我将如何编辑我的文件,以便在我的应用程序中的任何页面(源自母版页)上发生的任何错误,只需通过母版页显示此基本信息,而不是将页面重定向到另一个 URL?

【问题讨论】:

  • 我知道这不是问题所在,但另一种方法是在 global.asax Application_Error 方法中处理这个问题。 msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspx
  • 感谢@EladLachmi。我相信这就是我现在正在做的事情。我一直在寻找一种包含在我的母版页中的更优雅的方法。
  • 我们有一个非常大的网站,其中包含许多母版页,我们发现记录所有异常/针对我们应用程序中抛出的所有不同类型的异常重定向到错误页面的唯一一致方法就是这样。跨度>

标签: c# asp.net visual-studio-2010 master-pages


【解决方案1】:

我知道问题是关于如何让MasterPage 解决方案发挥作用,但我认为使用应用程序级别的Error 事件是制作包罗万象的错误处理程序以转发到错误页面的最佳方式.

您基本上需要处理Global.asax 文件中的Application_Error。在这里,您不仅可以处理所有页面级错误,还可以处理应用程序级错误和某些类型的 HTTP 错误(如果它们可以到达您的应用程序管道)。

我认为这是一种更好、更集中的方法。添加 MasterPage 级别或 BasePage 级别的错误事件处理程序也是可能的,但作为第二层。

查看here 以获得这样做的好例子。

【讨论】:

    【解决方案2】:

    您将无法使用控件为未处理的页面级错误设置错误消息,因为不会创建控件(请参阅此MS article)。您可以在页面级别捕获错误并像这样设置母版页内容:

        protected override void OnError(EventArgs e) {
            var err = Server.GetLastError().GetBaseException();
            var errorMessage = String.Format("URL {0}: {1} Error: {2}", Request.Url, err.GetType(), err.Message);
            ((MyMasterPageClass)Master).ShowError(errorMessage);
            Server.ClearError();            
        }
    

    然后在Master Page中直接设置内容:

        public void ShowError(string message) {
            Response.Write(string.Format("<h4 id=\"bannerError\">{0}</h4>", message));
        }
    

    但同样,您的母版页无论如何都不会呈现,所以它有点违背了目的。如果你真的想避免重定向到错误页面,你可以使用 jQuery.get() 之类的 ajax 加载内容,然后根据需要显示结果/错误:

    var request = $.get("www.mywebsite.com/Bugs2012.aspx");
    
    request.done(function (data) {
        $("#childContent").html(data);
    });
    
    request.fail(function (xhr, status, msg) {
        var displayMsg = "Request could not be completed. ";
        if (status === "error") {
            switch (xhr.status) {
                case 404: 
                    displayMsg += "The content could not be found.";
                    break;
            }
        }
        $("#bannerError").text(displayMsg);
    });
    

    我尝试创建一个 jsfiddle,但由于跨域 ajax 问题,它有点做作:js fiddle

    【讨论】:

    • 您能否举例说明当有人试图访问我的网站不再包含的页面时 jQuery 如何捕获,例如这个旧文件 www.mywebsite.com/Bugs2012.aspx
    • 当然,有几种不同的方法可以做到这一点。如果您使用 $.get() 那么您将检查 .fail() 回调中的响应状态代码,如果它是 404 您将相应地设置您的消息。您还可以使用 $.ajax() 并使用 statusCode 属性为每个 statusCode 添加回调。我也不喜欢这种方式,因为它有可能不必要地拆分错误处理。我将编辑我的答案以显示使用 $.get() 的示例。
    猜你喜欢
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2021-12-23
    • 2018-12-20
    • 1970-01-01
    • 2010-09-27
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多