参考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>
答案 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