2014-02-19 26 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是一個很好的例子。

相關問題