Tôi tìm thấy giải pháp here
tôi đã phải tạo ra một bộ lọc hành động để ghi đè lên hành vi mặc định của MVC
Dưới đây là lớp ngoại lệ của tôi
class ValidationException : ApplicationException
{
public JsonResult exceptionDetails;
public ValidationException(JsonResult exceptionDetails)
{
this.exceptionDetails = exceptionDetails;
}
public ValidationException(string message) : base(message) { }
public ValidationException(string message, Exception inner) : base(message, inner) { }
protected ValidationException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
Lưu ý rằng tôi có constructor mà khởi JSON của tôi. Dưới đây là bộ lọc hành động
public class HandleUIExceptionAttribute : FilterAttribute, IExceptionFilter
{
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.Exception != null)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
filterContext.Result = ((ValidationException)filterContext.Exception).myJsonError;
}
}
Bây giờ tôi có bộ lọc hành động, tôi sẽ trang trí điều khiển của tôi với các thuộc tính lọc
[HandleUIException]
public JsonResult UpdateName(string objectToUpdate)
{
var response = myClient.ValidateObject(objectToUpdate);
if (response.errors.Length > 0)
throw new ValidationException(Json(response));
}
Khi lỗi được ném lọc hành động mà thực hiện IExceptionFilter được gọi và Tôi lấy lại Json trên máy khách về lỗi gọi lại.
Trong trường hợp người đọc đang nghĩ "Có phải tất cả những gì cần thiết không?", Câu trả lời là "không". - Tôi đã ở trong tình trạng tương tự như @Sarath và muốn trả lại mã lỗi HTTP và một số dữ liệu JSON mô tả lỗi. Nó bật ra tôi chỉ có thể sử dụng các dòng nơi phản ứng đã được xóa, lỗi tùy chỉnh IIS được bỏ qua và mã trạng thái được ngồi. Tôi đặt 3 dòng đó vào Action của mình trên Controller, và sau 3 dòng đó, tôi vừa trả về dữ liệu JSON của mình như bình thường. Làm việc như người ở. –
Thực ra đó là sự thật, nhưng để có thể tái sử dụng, bạn sẽ muốn làm như câu trả lời cho biết thay vì sao chép/dán cùng một mã vào mỗi hành động. – Hades
Nếu tôi đặt 'StatusCode = 500' thì nó bỏ qua JsonResponse của tôi và thay vào đó trả về" Trang không thể được hiển thị vì đã xảy ra lỗi máy chủ nội bộ ". Không chắc chắn nếu điều này là do sự khác biệt trong đường ống OWIN hoặc cái gì. – AaronLS