4

Visual Studio 2008で、新しい「Ajax 1.0 Enabled ASP.NET 2.0 Webアプリケーション」を作成し、次のコードを貼り付ける場合:

<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アプリケーションを作成して同じコードを貼り付けると、アラートは表示されなくなります。私は何が欠けていますか?

4

2 に答える 2

15

ブラウザの 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 をキャッチする必要はありません。これに関する詳細情報が必要な場合は、私のブログ投稿にアクセスしてください。

于 2010-01-20T01:51:19.343 に答える
6

ASP.NET AJAX Extensions 1.0 と ASP.NET AJAX 3.5 では、既定の動作が明らかに変更されました。これは、Sys.WebForms.PageRequestManager のデフォルトの endPostBack イベント ハンドラーを見るとわかります。前のバージョンは Alert を使用してエラーを表示しますが、後者は単にエラーを再スローします。

// 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 を取得し、アラートを使用してユーザーにメッセージを表示できます。

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

これが役立つことを願っています。

于 2009-09-02T13:46:20.407 に答える