通过没有[]附加的JsonResult返回错误

时间:2017-02-21 15:08:09

标签: c# json ajax asp.net-mvc

我对这一切都很陌生,所以请耐心等待。我通过AJAX在我的控制器中调用JsonResult方法。 JsonResult操作方法调用一个私有方法,该方法调用存储过程,将数据加载到对象中,并将其返回以进行序列化并返回到客户端AJAX调用。

一切都很好,但是当我发现Oracle异常时,我希望能够返回错误。我目前只是在我的catch中执行Response.Write,但因为它正在通过JsonResult操作,它会将[]附加到消息中。我总是可以在客户端修剪它,但我觉得我不应该这样做,或者有更好的清洁方式。

AJAX致电:

    $.ajax({
    type: "GET",
    url: "/Controller/JsonResultActionMethod",
    dataType: "json",
    data: { someVar: someData },
    cache: false,
    success: function (results) {
        // Do some stuff
    },
    error: function (xhr, status, error) {
        alert(xhr.responseText);
    }
});

JsonResult行动:

    [HttpGet]
    public JsonResult JsonResultActionMethod(string someVar)
    {
        var myObjects = GetObjects(someVar);
        return Json(myObjects , JsonRequestBehavior.AllowGet);
    }

GetObjects方法(调用存储过程并返回myObject列表)

    private List<myObject> GetObjects(string someVar)
    {
        var myObjList = new List<InspectionModel>();

        try
        {
            // call stored procedure, create new instance of object, and load up myObjList. All of this works just fine
        }
        catch (OracleException ex)
        {
            // error handling is a bit more robust. simplified for example. ex.Message, when returned to page and displayed via xhr.responseText will appear as such: "Some error message from Oracle[]"
            Response.Write(ex.Message);
        }

        return disasterList;
    }

有没有办法从catch {}返回错误消息,以便它可以序列化为JSON对象?我想过将一个List属性添加到myObject并在那里存储错误。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这实际上是一个很好的问题,因为它与API设计有关。我还没能找到最好的&#34;解决这个问题。但我会创建一个BaseResponse类,其中包含Exception的字段,然后是实际的对象本身。像这样:

public class BaseResponse<T> {
    public T Data { get; set; }
    public Exception Error { get; set; }

    public object GetResponse() {

        //If an exception has not been thrown then just return your data
        if(Error == null)
            return Data;

        //If an exception has been thrown, return the exception
        return Error;
    }
}  

然后您可以使用Controller中的此BaseResponse类。

[HttpGet]
public JsonResult GetObjects(string someVar)
{
    var response = BaseResponse<InspectionModel>();

    try {
        response.Data = GetObjects(someVar);
    }
    catch(Exception e) {
        response.Error = e;
    }

    return Json(response.GetResponse() , JsonRequestBehavior.AllowGet);
}

使用过滤器有很多更好的方法来包装所有这些。然后所有这些都可能在后台发生,您不必在任何地方复制此代码。