Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET Custom Error Page for Web App that uses a Master Page

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

I understand how to create a Custom Errors page. There are many examples of how to do it, like in the link above.

None of the examples I have found shows how to do what I am after.

I have a Web Application that uses a Master Page.

In my Master Page, I have a Label control used for errors that all pages will see:

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

In the code behind on that Master Page, I have this:

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;
  }
}

The ErrorMessage is a property. My other pages can easily access it, and I was easily able to edit out the part about writing the error to our server's database.

The Web.config page configuration (snippet):

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

How would I edit my files so that any errors that occur on any of my pages in my application (that derive from Master Page), simply show this basic information through the Master Page instead of redirecting the page to another URL?

like image 202
jp2code Avatar asked Feb 19 '14 16:02

jp2code


People also ask

Which attribute of the custom errors section is used to set the custom error page URL?

The defaultRedirect attribute is optional. If provided, it specifies the URL of the custom error page and indicates that the custom error page should be shown instead of the Runtime Error YSOD. The mode attribute is required and accepts one of three values: On , Off , or RemoteOnly .

How do I display an error page?

To display a custom error page with an appropriate error code, use the <httpErrors> section only, and do not use the <customErrors> section. Add the following <httpErrors> section under <system. webServer> section, as shown below.


2 Answers

I know the question was about how to get the MasterPage solution to work, but I think that using the application level Error event is the best way to make a catch-all error handler to forward to an error page.

You basclly need to handle the Application_Error in the Global.asax file. Here you can not only handle all page-level errors, but also application-level errors and HTTP errors of some types (if they can reach your application pipeline).

I think this is a better and more cetralized method. Adding MasterPage-level or BasePage-level error event handlers is also possible, but as a second layer.

Look here for a good example of doing this.

like image 74
Elad Lachmi Avatar answered Nov 16 '22 00:11

Elad Lachmi


You won't be able to use controls to set the error message for unhandled Page level errors because no controls will be created (see this MS article). You could catch errors on the Page level and set the Master Page content like this:

    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();            
    }

And then in the Master Page set the content directly:

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

But again, your Master Page wouldn't be rendering anyway, so it sort of defeats the purpose. If you really want to avoid the redirecting to an error page, you could load the content with ajax using something like jQuery.get(), and then display the results/errors as needed:

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);
});

I tried to create a jsfiddle, but it's a bit contrived because of the cross-domain ajax issues: js fiddle

like image 30
Walter Avatar answered Nov 16 '22 00:11

Walter