使用母版页的Web应用程序的ASP.NET自定义错误页面

时间:2014-02-19 16:57:17

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

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

我了解如何创建自定义错误页面。有许多如何做的例子,如上面的链接。

我找到的所有例子都没有显示我如何做我想要的事情。

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

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

<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页面配置(摘要):

<?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?< / p>

2 个答案:

答案 0 :(得分:3)

我知道问题是关于如何使MasterPage解决方案起作用,但我认为使用应用程序级Error事件是使catch-all错误处理程序转发的最佳方法到错误页面。

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

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

here这是一个很好的例子。

答案 1 :(得分: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();            
    }

然后在母版页中直接设置内容:

    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