http://www.wyjexplorer.cn/Post/2012/8/1/invoking-jsonresult-and-return-error-message-in-aspnet-mvc-ajax
一、如何用AJAX調用JsonResult方法
比如FuckController中添加有個返回JsonResult類型的方法FuckJson():
public JsonResult FuckJson(){ return new JsonResult() { Data = new List<string>() { "fuck", "shit" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };} |
如果我們直接在瀏覽器裡調用,是可以看到結果的:
因為在瀏覽器地址欄直接輸入這個地址,是一次GET請求,這就是為毛上面的代碼裡要寫JsonRequestBehavior.AllowGet。
用JQuery AJAX調用的代碼如下:
$.ajax({ url: "/Fuck/FuckJson", data: "", dataType: "json", type: "POST", contentType: "application/json; charset=utf-8", dataFilter: function (data) { return data; }, success: function (data) { alert(data); }}) |
url: "/Fuck/FuckJson" 很顯然是Action的位置。data: "" 表示FuckJson()放方沒有參數。dataType: "json"是理所當然的,我們返回的就是JsonResult。
二、返回自訂錯誤訊息
預設情況下,如果AJAX請求發生了錯誤。它最多隻知道錯誤碼,而無法顯示具體的錯誤資訊。但報錯通常是需要的,所以我們先要寫一個過濾器,作用是 一旦發生exception,就給返回的json中的data屬性加一個errorMessage。並且,response的狀態不能是200,不然 ajax請求會以為沒有發生錯誤。一般的伺服器端錯誤碼是500。這個過濾器函數如下:
public class JsonExceptionFilterAttribute : FilterAttribute, IExceptionFilter{ public void OnException(ExceptionContext filterContext) { if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { filterContext.HttpContext.Response.StatusCode = 500; filterContext.ExceptionHandled = true; filterContext.Result = new JsonResult { Data = new { errorMessage = filterContext.Exception.Message }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } }} |
之後,我們要給FuckJson()方法加上這個“特徵”(Attribute在C#中最好不要翻譯為屬性),然後故意拋個錯做測試。修改後的方法如下:
[JsonExceptionFilterAttribute]public JsonResult FuckJson(){ try { throw new Exception("oh shit!"); return new JsonResult() { Data = new List<string>() { "fuck", "shit" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } catch (Exception ex) { throw ex; }} |
捕獲異常後,你也可以先記一下log、或是根據你自己的需要處理一下這個異常,然後再throw。
最後我們的AJAX請求代碼也得做修改,增加一個error的處理:
$.ajax({ url: "/Fuck/FuckJson", data: "", dataType: "json", type: "POST", contentType: "application/json; charset=utf-8", dataFilter: function (data) { return data; }, success: function (data) { alert(data); }, error: function (fuckedObject) { try { var json = $.parseJSON(fuckedObject.responseText); alert(json.errorMessage); } catch(e) { alert('something bad happened'); } }}) |
現在請求這個Action,會發現Response的狀態已經是500了。並且返回了Json格式的錯誤資訊。