4 Stimmen

Update-Panel zeigt keine Fehler in ASP.NET 3.5

Wenn Sie in Visual Studio 2008 eine neue "Ajax 1.0 Enabled ASP.NET 2.0 Web Application" erstellen und den folgenden Code einfügen:

<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>

Code dahinter

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

und dann auf die Schaltfläche klicken, sehen Sie eine Javascript-Warnung, die "Hallo" sagt. Wenn Sie eine .NET 3.5-Webanwendung erstellen und denselben Code einfügen, wird keine Meldung mehr angezeigt. Was übersehe ich?

0 Stimmen

Also... niemand benutzt .NET 3.5, oder niemand macht sich Sorgen über Fehler? :)

15voto

Wenn Sie nur den Javascript-Fehler des Browsers beheben und dem Benutzer eine Ausnahmemeldung anzeigen möchten, müssen Sie dies nur irgendwo nach der Formulardeklaration zu Ihrer Masterpage hinzufügen:

<!-- 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>

Sie müssen den OnAsyncPostBackError nicht abfangen, es sei denn, Sie möchten die Meldung anpassen. Weitere Informationen hierzu finden Sie in meinem Blogbeitrag.

6voto

Rob Windsor Punkte 6595

Es gab definitiv eine Änderung zwischen dem Standardverhalten in ASP.NET AJAX Extensions 1.0 und ASP.NET AJAX 3.5. Dies wird deutlich, wenn man sich die standardmäßigen endPostBack-Ereignishandler für den Sys.WebForms.PageRequestManager ansieht. In der ersten Version wird der Fehler mit einem Alert angezeigt, während in der zweiten Version der Fehler einfach zurückgeworfen wird.

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

Wenn Sie möchten, dass der Alert in Ihrem ASP.NET AJAX 3.5-Code erscheint, müssen Sie nur einige kleine Änderungen vornehmen.

Zunächst müssen Sie einen Handler für das Ereignis AsyncPostBackError des ScriptManagers hinzufügen und dann die AsyncPostBackErrorMessage festlegen.

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

Dann müssen Sie einen Handler für das endRequest-Ereignis des clientseitigen PageRequestManagers hinzufügen. Darin können Sie die AsyncPostBackErrorMessage auf der Serverseite abrufen und einen Alert verwenden, um die Nachricht für den Benutzer anzuzeigen.

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

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X