2010-10-11 42 views
29

Tôi đang cố gắng trả về một thông báo lỗi qua Json từ bộ điều khiển ASP.NET MVC. Tôi muốn hiển thị kí tự xuống dòng trên màn hình, do đó lỗi sẽ trông giống như:trả về lỗi Json từ ASP.NET MVC

Lỗi 1.
Lỗi 2.

thay vì "Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"

Dưới đây là ASP.NET MVC của tôi mã

Response.StatusCode = (int)HttpStatusCode.BadRequest; 
string str = "Error 1.<br/>Error 2.<br.>"; 
return Json(str); 

JavaScript (redacted):

.ajax({... 
    error: function(xhr, textStatus, exceptionThrown) { 
     $('#result').html(xhr.responseText); 
    }, 

Debugging sản lượng xhr.responseText: ""Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e""

Bất kỳ ý tưởng?

+0

tôi đọc cho nhanh, xấu của tôi : D. – bastijn

+0

Tôi giả định là lỗi đánh máy. – Alex

Trả lời

62

sẽ đẹp hơn để trả về danh sách lỗi và sau đó tạo html tại máy khách.

Response.StatusCode = (int)HttpStatusCode.BadRequest; 
List<string> errors = new List<string>(); 
//..some processing 
errors.Add("Error 1"); 
//..some processing 
errors.Add("Error 2"); 
return Json(errors); 

và sau đó ở phía client

.ajax({... 
    error: function(xhr, textStatus, exceptionThrown) { 
     var errorData = $.parseJSON(xhr.responseText); 
     var errorMessages = []; 
     //this ugly loop is because List<> is serialized to an object instead of an array 
     for (var key in errorData) 
     { 
     errorMessages.push(errorData[key]); 
     } 
     $('#result').html(errorMessages.join("<br />")); 
    }, 

bạn cũng có thể trả về một đối tượng lỗi cụ thể hơn và sử dụng một giải pháp mẫu, nhưng đây là ý tưởng

+0

Avi, điều này thật tuyệt vời. Làm việc như một say mê. Cảm ơn bạn rất nhiều. – Dean

+0

vui vì điều đó đã giúp :) –

+1

Bạn có chắc chắn rằng điều này sẽ không mang lại thành công? Tôi thường làm: return Json (new {success = false, errors = ...}); – Santhos

12

Nếu bạn đang sử dụng JSON có thể bạn không muốn nhúng HTML (mà loại đánh bại mục đích trở về một "dữ liệu" đối tượng mà bạn sẽ định dạng trên xem.)

Nếu bạn muốn quay trở lại HTML bạn có thể làm điều này trong điều khiển của bạn:

Response.StatusCode = (int)HttpStatusCode.BadRequest; 
return Content("Error 1.<br/>Error 2.<br/>"); 
+0

Trả về HttpStatusCode không hoạt động trong môi trường thử nghiệm của chúng tôi nhưng hoạt động trên máy tính dev của tôi. Chức năng thất bại ajax không bao giờ được nhấn. Bất kì manh mối nào? – Jeff

2

Yea, bạn đang đánh bại mục đích như @Hector nói ..

Và nếu bạn muốn trở thành sự thật JSON, có lẽ cố gắng trả lại một Json(Dictionary<String, Object>) thay vì a Json(string).

5

Dường như với tôi rằng bạn đã thực hiện gần như mọi thứ đều chính xác. Các kết quả mà bạn có trong xhr.responseText là một chuỗi JSON. Vì vậy, bạn nên chèn chỉ có một cuộc gọi bổ sung của JSON.parse chức năng

.ajax({... 
    error: function(xhr, textStatus, exceptionThrown) { 
     $('#result').html(JSON.parse(xhr.responseText)); 
    }, 

sau đó dữ liệu như '"Error1.\u003cbr/\u003eErro2.\u003cbr.\u003e"' sẽ được chuyển đổi sang chuỗi 'Error 1.<br/>Error 2.<br/>'.

Bên trong success xử lý sự kiện các ajax chức năng gọi JSON.parse cho bạn, nhưng nó không này bên trong handler error. Vì vậy, chuyển đổi phản hồi của máy chủ từ chuỗi JSON bạn phải thực hiện theo cách thủ công.

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