簡體   English   中英

MVC Rethrow自定義異常為JSON

[英]MVC Rethrow custom exception as JSON

我從我的MVC視圖調用Web服務,並希望在異常拋出時使用jquery ajax錯誤功能。

我試圖將自定義創建的異常從我的MVC業務層拋出到我的表示層控制器中,並將其重新拋出為json響應。

我可以成功拋出自定義異常,問題在於它是HTML視圖。 我已經看到了聲明自定義錯誤響應的方法,但我希望能夠直接將該異常重新拋出為JSON。

有任何想法嗎?

使用Javascript:

$.ajax({
            type: "POST",
            url: 'create',
            data: "{userDetails:" + JSON.stringify(details) + "}",
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                data = data.d;
                redirectSuccess();
            },
            error: function(err) {
                //display thrown exception here
            }
        });

CS

public JsonResult create(MyModel.New details)
        {
            try
            {
                Library.insert(details);
                return Json(true); 
            }
            catch (Exception ex)
            {
                throw;
            }
        }

在此先感謝您的幫助!

我最終找到了合適的解決方案。

對於想要對我問的問題做出類似回答的人,我所做的就是聲明一個自定義過濾器。 這個主要部分是將過濾結果設置為以JSON形式返回,但即使這樣,它也會在jquery ajax調用中返回成功,因為它返回狀態200,jquery ajax讀取為成功。

Jquery ajax讀取200之外的任何狀態作為錯誤,因此您可以看到我將狀態代碼更改為我創建並將記錄的自定義數字,因此jquery ajax會看到錯誤並將其拋出到ajax錯誤。

public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            filterContext.HttpContext.Response.StatusCode = 11001;
            filterContext.ExceptionHandled = true;
            filterContext.Result = new JsonResult

            {
                Data = new { success = false, error = filterContext.Exception.ToString() },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
        }
    }

要引用當前過濾器,只需將錯誤處理程序屬性添加到函數中,如下面第一行所示:

[MyErrorHandler]
public JsonResult create(MyModel.New details)
    {
        try
        {
            Library.insert(details);
            return Json(true); 
        }
        catch (Exception ex)
        {
            return Json(ex.Message); 
        }
    }

我不認為它的工作方式你認為你需要將異常作為響應傳遞給前端。

public JsonResult create(MyModel.New details)
    {
        try
        {
            Library.insert(details);
            return Json(true); 
        }
        catch (Exception ex)
        {
            return Json(ex.Message); 
        }
    }

然后用JS成功處理它。

$.ajax({
        type: "POST",
        url: 'create',
        data: "{userDetails:" + JSON.stringify(details) + "}",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            if (data.Message)
            {
             //display error
             }else{
            data = data.d;
            redirectSuccess();}
        },
        error: function(err) {
            //display thrown exception here
        }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM