2012-03-13 69 views
0

我想分析JSON結果,包含狀態或錯誤消息,從控制器方法或自定義異常過濾器返回並顯示消息。jQuery解析從控制器返回的JSON結果

 $.ajax({ 
     url: "/Account/LogOn", 
     type: "POST", 
     dataType: "json", 
     data: form.serialize(), 
     success: function (result) { 
      alert(result);  
     } 
    }); 

我認爲使用這段代碼我可以爲特定的操作結果或方法做到這一點。有沒有辦法爲每個返回到頁面的JSON結果做到這一點?

回答

2

沒有,有沒有辦法通過控制器的行動返回每一個可能的JSON這樣做是因爲結構會有所不同,這result變量的性質將不一樣。

正確的方法是有一個自定義錯誤處理程序,它將攔截所有異常並將它們包裝在一個定義良好的JSON結構中。然後你可以在AJAX請求中使用錯誤回調來處理這種情況。

public class AjaxErrorHandler : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new JsonResult 
      { 
       Data = new 
       { 
        ErrorMessage = filterContext.Exception.Message 
       }, 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
      filterContext.ExceptionHandled = true; 
      filterContext.HttpContext.Response.Clear(); 
      filterContext.HttpContext.Response.StatusCode = 500; 
      filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
     } 
    } 
} 

這可以被註冊爲一個全球性的動作過濾器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new AjaxErrorHandlerAttribute()); 
} 

,並在客戶端上,你也可以擁有在同一頁上的所有AJAX請求的全局AJAX錯誤處理程序:

$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) { 
    var json = $.parseJSON(jqXHR.response); 
    alert(json.ErrorMessage); 
}); 
+0

如何拋出異常?我試圖[HttpPost] [AjaxErrorHandler] 公共的ActionResult登錄(LogOnModel模型,串RETURNURL) { //一些代碼 如果(布拉布拉) 擲新的異常( 「BLABLA」); }但它沒有奏效。 – 2012-03-13 20:27:43

+0

我試着用Ajax.BeginForm而不是Html.BeginForm。 AjaxErrorHandler會發生異常,但客戶端上的全局Ajax錯誤處理程序不會顯示消息。 – 2012-03-13 21:28:56

0
$.ajax({ 
    url: "/Account/LogOn", 
    type: "POST", 
    dataType: "json", 
    data: form.serialize(), 
    success: function (result) { 
     alert(result);  
    } 
    error: function (req, status, error) { 
     //your logic 
    } 
});