我找到了解決辦法here
我不得不創建一個動作過濾器來覆蓋MVC
這裏的默認行爲是我的異常類
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) { }
}
請注意,我有構造函數初始化我的JSON。這裏是動作過濾器
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;
}
}
現在,我有行動過濾器,我來裝飾我的控制器與過濾器屬性
[HandleUIException]
public JsonResult UpdateName(string objectToUpdate)
{
var response = myClient.ValidateObject(objectToUpdate);
if (response.errors.Length > 0)
throw new ValidationException(Json(response));
}
當錯誤被拋出的動作過濾器,它實現個IExceptionFilter被調用和我在錯誤回調中返回客戶端上的Json。
如果讀者認爲「所有必要?」,答案是「否」。 - 我和@Sarath處於相同的情況,並希望返回一個HTTP錯誤代碼和一些描述錯誤的JSON數據。事實證明,我可以只使用清除響應的行,IIS自定義錯誤將被跳過,並且狀態碼已被佔用。我將這3行放在我的控制器的Action中,在這3行之後,我只是像往常一樣返回我的JSON數據。像魅力一樣工作。 – 2013-02-10 16:17:02
事實確實如此,但爲了可重複使用,您可能希望按照答案的指示進行操作,而不是將相同的代碼複製/過濾到每個操作中。 – Hades 2013-06-06 15:35:39
如果我設置了'StatusCode = 500',那麼它會忽略我的JsonResponse,而是返回「頁面無法顯示,因爲發生了內部服務器錯誤。」。不知道這是由於OWIN管道中的差異還是由於什麼。 – AaronLS 2016-04-21 19:36:33