2011-11-08 39 views
5

Tôi có một hành động:ASP.NET MVC nhận được thông báo ngoại lệ trong Ajax

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
    ... 
    if (model.MyCondition == true) 
     throw new Exception("MyMessage); 
    .... 
} 

Tôi muốn nhận được thông báo "MyMessage" ở phía Ajax:

onSuccess: function() { 
... 
}, 
onError: function (jqXHR, textStatus, errorThrown) { 
//I'd like get "MyMessage" here 
} 

Một ý tưởng làm thế nào để làm cái này ? Khi tôi kiểm tra với trình gỡ lỗi, tôi không thấy chuỗi của mình.

Trả lời

8

Việc triển khai thuộc tính lỗi là một cách hay. Ngoài ra, tôi thường không ném ngoại lệ, nhưng trả lại status code theo lỗi. Bạn có thể viết thư cho dòng trả lời của bạn và truy cập vào js qua XMLHttpRequest.responseText:

if (model.MyCondition == true) 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     Response.StatusCode = 406; // Or any other proper status code. 
     Response.Write("Custom error message"); 
     return null; 
    } 
} 

và trong js:

... 
error: function (xhr, ajaxOptions, errorThrown) { 
    alert(xhr.responseText); 
} 
0

Thử trả lại ContentResult từ Hành động của bạn bằng hành động loại GET.

[HttpGet] 
public ContentResult MyAction(String variablename) 
{ 
    ... 
    if (some_verification == true) 
     return Content("MyMessage); 
    .... 
} 

Trên trang điểm của bạn,

$.ajax({ 
    url: 'your controller/action url', 
    type: 'get', 
    cache: false, 
    async: false, 
    data: { variablename: "value" }, 
    success: function (data) { 
     alert(data); 
    }, 
    error: function() { 
     alert('Error doing some work.'); 
    } 
}); 
+0

Câu hỏi là lấy chuỗi từ trường hợp ngoại lệ ném trong bộ điều khiển không cách nào để thay đổi gọi hành động –

+0

aah đúng. cảm ơn. – Muthu

0

Tôi đã giải quyết này thực hiện một ErrorAttribute tùy chỉnh:

[NonAction] 
protected void OnException(ExceptionContext filterContext) 
{ 

    this.Session["ErrorException"] = filterContext.Exception; 

    if (filterContext.Exception.GetType() == typeof(MyException)) 
    { 
     // Mark exception as handled 
     filterContext.ExceptionHandled = true; 
     // ... logging, etc 
     if (Request.IsAjaxRequest()) 
     { 
      /* Put your JSON format of the result */ 
      filterContext.Result = Json(filterContext.Exception.Message); 
     } 
     else 
     { 
      // Redirect 
      filterContext.Result = this.RedirectToAction("TechnicalError", "Errors"); 
     } 
    } 
} 

và sau đó trang trí hành động của tôi với nó.

Bạn cũng có thể ghi đè phương pháp OnException của bộ điều khiển, nhưng tôi nghĩ rằng thuộc tính tùy chỉnh là cách linh hoạt hơn.

0

Một khả năng có thể để tạo ra một lớp BaseController nơi bạn ghi đè phương pháp OnException(ExceptionContext filterContext) của điều khiển và chuyển đổi các ngoại lệ vào JSON để có thể dễ dàng xử lý chúng từ một ứng dụng JavaScript.

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