我对这一切都很陌生,所以请耐心等待。我通过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并在那里存储错误。有更好的方法吗?
答案 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);
}
使用过滤器有很多更好的方法来包装所有这些。然后所有这些都可能在后台发生,您不必在任何地方复制此代码。