2013-04-18 11 views
10

Ich habe diese einfache Ajax-Form in meinen MVC3 App, sendet diese E-Mail-Nachricht:Wie zeigt man eine Fehlermeldung nur in OnFailure von Ajax.BeginForm in MVC3 an?

@using (Ajax.BeginForm("SendMessage", new AjaxOptions { 
    LoadingElementId = "wait", 
    OnSuccess = "loadMessages", 
    OnFailure = "showError" })) 
{ 
    <input type="text" name="message" placeholder="Message" /> 
    <input type="submit" name="submit" value="Send" /> 
} 

Wenn die Aktion eine Nachricht senden fehlschlägt, die Ausnahme auslöst. Die Ausnahme wird behandelt und in dem Error-(Fehler) angezeigt {} Javascript-Funktion:

function showError(error) { 
    $("#error").text(error.responseText); 
}; 

Das Problem ist: error.responseText ist der HTML-Dump der gesamten Fehlerseite.

Ich muss nur die Ausnahme Fehlermeldung (was auch immer in ex.Message in MVC3 ist) anzeigen.

Die Implementierung von "öffentliche ActionResult SendMessage (Zeichenfolge Nachricht) {}" ist irrelevant.

Ich muss wissen, wie die Nachricht der Ausnahme nur in showError (Fehler) Javascript-Handler angezeigt wird.

Vielen Dank.

[HttpPost] 
    public ActionResult SendMessage(string message) 
    { 
     MailMessage mail = new MailMessage(); 
     SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"); 
     mail.From = new MailAddress("[email protected]"); 
     mail.Subject = "Some Message"; 
     mail.Body = message; 
     mail.To.Add("[email protected]"); 
     SmtpServer.Send(mail); 
     return null; 
    } 
+0

Bitte zeigen Sie Ihre SendMessage Aktion ... –

+0

Nicht sicher, was es mit der Frage zu tun hat ... 8 | – monstro

+0

b/c Sie können OnFailure nur verwenden, wenn Sie einen HTTP-Fehler erfassen möchten. Willst du verstehen, wie Sie Fehler –

Antwort

0

Sie könnten Ihre Ausnahme in der Steuerung abfangen und eine genaue Fehlermeldung zurück senden. Etwas wie:

[HttpPost] 
public ActionResult SendMessage(string message) 
{ 
    try 
    { 
     MailMessage mail = new MailMessage(); 
     SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"); 
     mail.From = new MailAddress("[email protected]"); 
     mail.Subject = "Some Message"; 
     mail.Body = message; 
     mail.To.Add("[email protected]"); 
     SmtpServer.Send(mail); 
     return null; 
    } 
    catch (e) 
    { 
     throw new HttpException(500, e.Message); 
    } 
} 

Möglicherweise müssen Sie die Antwort in diesem Fall prüfen und Ihren Javascript aktualisieren showError entsprechend.

+0

zurückgeben Danke, aber es unterscheidet sich nicht von dem, was ich ohne Versuch habe zu fangen - es gibt auch HTML-Dump der gesamten Fehlerseite zurück. Nicht sicher, ob der OnFailure-Parameter des Ajax.BeginForm-Helpers die Ausnahme behandeln kann, indem nur die Fehlermeldung angezeigt wird. Sieht so aus, als ob es nicht möglich ist. Nur komisch, wie soll das funktionieren, wenn Sie immer HTML-Dump von Fehler zurück vom Controller bekommen ... Ich will keine TRY/CATCH-Blöcke absichtlich haben, ich möchte nur propagieren und die Systemausnahme ausgeben, wie es ist , aber nur Fehlermeldung, nicht der HTML-Inhalt. – monstro

6

Sie können nicht jede Ausnahme in der OnFailure-Methode behandeln. Denn OnFailure wird aufgerufen, wenn der Antwortstatus nicht im Bereich 200 liegt. So können Sie Ihr Szenario etwas wie folgt behandeln:

[HttpPost] 
    public ActionResult SendMessage(string message) 
    { 
     MailMessage mail = new MailMessage(); 
     ActionResult response = null; 
     SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"); 
     mail.From = new MailAddress("[email protected]"); 
     mail.Subject = "Some Message"; 
     mail.Body = message; 
     mail.To.Add("[email protected]"); 
     try 
     { 
      SmtpServer.Send(mail); 
      response = Content("Success"); 
     } 
     catch (Exception ex) 
     { 
      response = Content(ex.Message); 
     } 
     return response; 

    } 

Hier in diesem Code, wenn Mail senden erfolgreich dann habe ich zurückgegebene Antwort „Erfolg“ sonst habe ich die tatsächliche Fehler zurückgegeben und in Javascript habe ich diese Antwort wie diese behandelt :

function loadMessages(error) { 
    if (error == 'Success') { 
     alert("Mail Sent successfully"); 
    } 
    else { 
     $("#error").text(error); 
    } 

Hoffe, das wird Ihnen helfen.

1

Um dies in meiner eigenen Lösung zu lösen, habe ich die HttpStatusCodeResult-Klasse verwendet. Hier ist der Code, den ich als Referenz haben:

try 
{ 
    // Some code that can error 
} 
catch (Exception e) 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, e.Message); 
} 

// View 
OnFailure = "alert(error);" 

Dies sollte noch auslösen alle normalen Fehlerverhalten auf dem Client, einschließlich eines 500-Fehler im Browser-Konsole setzen und sollte perfekt funktionieren mit dem Skript Sie bereits sind Verwenden, um Ihren Fehler anzuzeigen.

Verwandte Themen