2013-04-18 39 views
10

Tôi có hình thức ajax đơn giản này trong ứng dụng MVC3 của tôi, mà gửi tin nhắn email:Làm thế nào để hiển thị thông báo lỗi chỉ trong OnFailure của Ajax.BeginForm trong MVC3?

@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" /> 
} 

Nếu hành động thất bại trong việc gửi một tin nhắn, nó ném ngoại lệ. Trường hợp ngoại lệ được xử lý và hiển thị trong showError (lỗi) {} javascript chức năng:

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

Vấn đề là: error.responseText là bãi html của toàn bộ trang lỗi.

Tôi chỉ cần hiển thị thông báo lỗi ngoại lệ (mọi thứ ở dạng ex.Message trong MVC3).

Việc triển khai "Public ActionResult SendMessage (chuỗi tin nhắn) {}" không liên quan.

Tôi cần biết cách hiển thị thông báo của ngoại lệ chỉ trong trình xử lý javascript showError (lỗi).

Cảm ơn một nhóm.

[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

vui lòng hiển thị hành động SendMessage của bạn ... –

+0

Bạn không chắc chắn những gì nó đã làm với câu hỏi ... 8 | – monstro

+0

b/c bạn không thể sử dụng onFailure trừ khi bạn muốn chụp một lỗi http. Bạn muốn hiểu cách bạn trả lại lỗi –

Trả lời

0

Bạn có thể bắt ngoại lệ của mình trong bộ điều khiển và gửi lại thông báo lỗi chính xác. Một cái gì đó như:

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

Bạn có thể cần phải xem xét các phản ứng trong trường hợp này và cập nhật javascript của bạn showError cho phù hợp.

+0

Cảm ơn, nhưng nó không khác với những gì tôi có mà không thử bắt - nó cũng trả về kết xuất html của toàn bộ trang lỗi. Không chắc chắn nếu tham số OnFailure của Ajax.BeginForm helper có thể xử lý ngoại lệ bằng cách chỉ nhận được thông báo lỗi. Có vẻ như không thể. Chỉ cần lạ, làm thế nào là điều này nghĩa vụ phải làm việc, nếu bạn luôn luôn nhận được dump html của lỗi trở lại từ bộ điều khiển ... Tôi không muốn có bất kỳ TRY/CATCH khối trên mục đích, tôi chỉ muốn tuyên truyền và đầu ra hệ thống ngoại lệ như là , nhưng chỉ có thông báo lỗi, không phải nội dung html. – monstro

6

Bạn không thể xử lý từng và mọi ngoại lệ trong phương pháp OnFailure. Bởi vì OnFailure được gọi nếu trạng thái phản hồi không nằm trong phạm vi 200. Vì vậy, bạn có thể xử lý tình huống một cái gì đó của bạn như thế này:

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

    } 

đây trong mã này nếu thư gửi thành công sau đó tôi đã quay trở lại trả lời "Thành công" khác mà tôi đã trả lại lỗi thực tế và trong javascript tôi đã xử lý phản ứng này như thế này :

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

Hy vọng điều này sẽ giúp bạn.

1

Để giải quyết điều này trong giải pháp của riêng tôi, tôi đã sử dụng lớp HttpStatusCodeResult. Dưới đây là đoạn code tôi có để tham khảo:

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

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

này vẫn nên kích hoạt tất cả các hành vi lỗi thông thường trên máy khách, bao gồm cả việc đưa một lỗi 500 trong trình duyệt giao diện điều khiển, và nên làm việc một cách hoàn hảo với kịch bản bạn đã sử dụng để hiển thị lỗi của bạn.

Các vấn đề liên quan