2009-09-01 48 views
4

在Visual Studio 2008中,如果你創建一個新的 「AJAX 1.0啓用ASP.NET 2.0 Web應用程序」,並粘貼以下代碼:更新面板不顯示錯誤在ASP.NET 3.5

<form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server" /> 
     <div> 
     <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate> 
       <asp:Button runat="server" ID="foo" Text="click me" onclick="foo_Click" />  
      </ContentTemplate> 
     </asp:UpdatePanel> 
     </div> 
    </form> 

代碼背後

protected void foo_Click(object sender, EventArgs e) { 
      throw new Exception("hello"); 
     } 

然後點擊按鈕,你會看到一個JavaScript警告,說「你好」。如果您創建.NET 3.5 Web應用程序並粘貼相同的代碼,則不會再顯示警報。我錯過了什麼?

+0

那麼......沒有人使用.NET 3.5,或者沒有人擔心會出錯? :) – aquinas 2009-09-02 13:14:48

回答

6

ASP.NET AJAX Extensions 1.0和ASP.NET AJAX 3.5中的默認行爲之間確實發生了變化。這可以通過查看Sys.WebForms.PageRequestManager的默認endPostBack事件處理程序來看到。前一個版本使用警報顯示錯誤,而後者則重新引發錯誤。

// ASP.NET AJAX Extensions 1.0 
function Sys$WebForms$PageRequestManager$_endPostBack(error, response) { 
    this._processingRequest = false; 

    this._request = null; 
    this._additionalInput = null; 

    var handler = this._get_eventHandlerList().getHandler("endRequest"); 
    var errorHandled = false; 
    if (handler) { 
    var eventArgs = new Sys.WebForms.EndRequestEventArgs(error, this._dataItems, response); 
    handler(this, eventArgs); 
    errorHandled = eventArgs.get_errorHandled(); 
    } 
    this._dataItems = null; 
    if (error && !errorHandled) { 
    alert(error.message); 
    } 
} 


// ASP.NET 3.5 
function Sys$WebForms$PageRequestManager$_endPostBack(error, executor, data) { 
    if (this._request === executor.get_webRequest()) { 
    this._processingRequest = false; 
    this._additionalInput = null; 
    this._request = null; 
    } 
    var handler = this._get_eventHandlerList().getHandler("endRequest"); 
    var errorHandled = false; 
    if (handler) { 
    var eventArgs = new Sys.WebForms.EndRequestEventArgs(error, data ? data.dataItems : {}, executor); 
    handler(this, eventArgs); 
    errorHandled = eventArgs.get_errorHandled(); 
    } 
    if (error && !errorHandled) { 
    throw error; 
    } 
} 

如果您希望警報出現在您的ASP.NET AJAX 3.5代碼中,您只需進行一些小的更改。

首先,您需要爲ScriptManager的AsyncPostBackError事件添加處理程序,然後設置AsyncPostBackErrorMessage。

protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) 
{ 
    ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message; 
} 

然後,您需要爲客戶端的PageRequestManager的endRequest事件添加一個處理程序。在那裏,你可以得到在服務器端設置的AsyncPostBackErrorMessage,並使用Alert向用戶顯示消息。

function pageLoad() 
{ 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest); 
} 

function onEndRequest(sender, args) 
{ 
    var msg = args.get_error().message; 
    alert(msg); 
    args.set_errorHandled(true); 
} 

我希望這會有所幫助。

+0

所以我不瘋狂。謝謝! – aquinas 2009-09-02 13:59:56

14

如果你只是想修復瀏覽器的JavaScript錯誤,並顯示異常信息給用戶,你只需要在窗體聲明後的某個地方本添加到您的母版:

<!-- This script must be placed after the form declaration --> 
<script type="text/javascript"> 
    Sys.Application.add_load(AppLoad); 

    function AppLoad() { 
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequest); 
    } 

    function EndRequest(sender, args) { 
     // Check to see if there's an error on this request. 
     if (args.get_error() != undefined) { 

      var msg = args.get_error().message.replace("Sys.WebForms.PageRequestManagerServerErrorException: ", ""); 

      // Show the custom error. 
      // Here you can be creative and do whatever you want 
      // with the exception (i.e. call a modalpopup and show 
      // a nicer error window). I will simply use 'alert' 
      alert(msg); 

      // Let the framework know that the error is handled, 
      // so it doesn't throw the JavaScript alert. 
      args.set_errorHandled(true); 
     } 
    } 
</script> 

你並不需要捕獲OnAsyncPostBackError,即使除非要定製消息。 Go to my blog post if you want more information about this.

+0

謝謝你! – Luis 2010-06-29 05:05:42

+0

也幫助了我。謝謝。 – 2010-12-11 10:37:15