2014-02-19 27 views
11

参考KB306355: How to create custom error reporting pages in ASP.NET by using Visual C# .NET使用主页的Web应用程序的ASP.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?

+0

我知道这不是问题,但另一种方法是在'global.asax' Application_Error'方法中处理这个问题。 http://msdn.microsoft.com/en-us/library/24395wz3(v=vs.100).aspx –

+0

谢谢@EladLachmi。我相信这就是我现在所做的。我正在寻找一种更加优雅的方法,它被包裹在我的主页面中。 – jp2code

+0

我们有一个非常大的网站,其中包含许多母版页,并且我们发现记录所有异常/重定向到错误页面的唯一一致方式是针对在我们的应用程序中抛出的所有不同类型的异常。 –

回答

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()阿贾克斯的内容,然后显示在需要的结果/错误:我试图创建

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

+0

你能否展示一个当有人试图访问我的网站不再包含的页面时,如何捕获jQuery的例子,就像这个旧文件'www.mywebsite.com/Bugs2012.aspx'? – jp2code

+1

当然,有几种不同的方式可以做到这一点。如果您使用$ .get(),那么您将检查.fail()回调中的响应状态代码,如果它是404,则会相应地设置您的消息。您也可以使用$ .ajax()并使用statusCode属性为每个statusCode添加回调。我不喜欢这种方式,因为它有可能不必要地分割错误处理。我将编辑我的答案以使用$ .get()显示示例。 – Sprockincat

2

我知道这个问题是关于如何让MasterPage解决方案的工作,但我认为使用应用程序级Error事件就是最好的让一个全部错误处理程序转发到错误页面的方法。

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

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

查看here是一个很好的例子。

相关问题