ASP.NET MVC3 AJAX調用JsonResult方法並返回自訂錯誤資訊

來源:互聯網
上載者:User
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格式的錯誤資訊。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.