2012-10-19 35 views
5

Tôi có một phương pháp trong một bộ điều khiển trông giống như thế này:Ném một lỗi trở về jQuery từ một MVC HttpPost

[HttpPost] 
public void UnfavoriteEvent(int id) 
{ 
    try 
    { 
     var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID", 
      new { EventID = id, UserName = User.Identity.Name }); 
     if (rows != 1) 
     { 
      Response.StatusCode = 500; 
      Response.Status = "There was an unknown error updating the database."; 
      //throw new HttpException(500, "There was an unknown error updating the database."); 
     } 
    } 
    catch (Exception ex) 
    { 
     Response.StatusCode = 500; 
     Response.Status = ex.Message; 
     //throw new HttpException(500, ex.Message); 
    } 
} 

Và như bạn có thể thấy tôi đã thử một vài cách khác nhau để ném lỗi này trở lại. Trong JavaScript Tôi có khối sau để gọi phương pháp này:

var jqXHR; 
if (isFavorite) { 
    jqXHR = $.ajax({ 
     type: 'POST', 
     url: '/Account/UnfavoriteEvent', 
     data: { id: $("#EventID").val() } 
    }); 
} 
else { 
    jqXHR = $.ajax({ 
     type: 'POST', 
     url: '/Account/FavoriteEvent', 
     data: { id: $("#EventID").val() } 
    }); 
} 

jqXHR.error = function (data) { 
    $("#ajaxErrorMessage").val(data); 
    $("#ajaxError").toggle(2000); 
}; 

Bây giờ, những gì tôi muốn làm là nhận được lỗi đó xảy ra ném trở lại jqXHR.error chức năng vì vậy mà tôi có thể xử lý nó đúng cách.

Hiện tại mã không được chú ý ném ngoại lệ cho biết văn bản tôi đang đặt trong Status không được phép và mã nhận xét thực sự trả về trang lỗi chuẩn làm phản hồi (không thực sự đáng ngạc nhiên).

Vì vậy, tôi có một vài câu hỏi:

  1. Làm thế nào để vứt lỗi đúng cách?
  2. Thuộc tính Response.Status làm gì?

Cảm ơn tất cả mọi người!

+0

Vì bạn đang bắt một ngoại lệ chung, tôi sẽ không gửi lại thông điệp cụ thể cho khách hàng. Điều này có thể kết thúc là thông tin nhạy cảm về ứng dụng của bạn. Nếu bạn nắm bắt các ngoại lệ tên miền tùy chỉnh nơi bạn kiểm soát thư bạn có thể gửi chúng cho khách hàng, nhưng đối với ngoại lệ chung, bạn nên gửi một thông báo chung. – BZink

+0

@BZink, điểm rất tốt. Cảm ơn bạn. –

Trả lời

3

Bạn sẽ được abled để có được tình trạng phản ứng từ phía javascript, cách làm như sau:

$.ajax({ 
    type: 'POST', 
    url: '/Account/UnfavoriteEvent', 
    data: { id: $("#EventID").val() }, 
    success: function(data, textStatus, jqXHR) { 
     // jqXHR.status contains the Response.Status set on the server 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // jqXHR.status contains the Response.Status set on the server 
    }}); 

Như bạn thấy, bạn phải vượt qua các chức năng cho error đến ajax chức năng ... trong bạn Ví dụ, bạn đang thiết lập chức năng cho thuộc tính error của jqXHR mà không có tác dụng gì cả.

Tài liệu về sự kiện ajax

docs jQuery nói rằng chuỗi lỗi sẽ đến trong tham số errorThrown.

Không sử dụng đáp ứng

Thay vào đó, bạn nên trở HttpStatusCodeResult:

[HttpPost] 
public void UnfavoriteEvent(int id) 
{ 
    try 
    { 
     var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID", 
      new { EventID = id, UserName = User.Identity.Name }); 
     if (rows != 1) 
     { 
      return new HttpStatusCodeResult(500, "There was an unknown error updating the database."); 
     } 
    } 
    catch (Exception ex) 
    { 
     return new HttpStatusCodeResult(500, ex.Message); 
    } 
} 
+0

Điều đó chắc chắn đã đưa tôi vào phương pháp lỗi trong JavaScript, vì vậy cảm ơn! Nhưng chuỗi lỗi tôi muốn không có trong 'Response.Status'. Tôi đang làm gì sai phía máy chủ và làm thế nào để tôi nhận được thông điệp đơn giản đó xuống cho khách hàng? –

+0

Cảm ơn, đó là chính xác những gì tôi cần! –

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