抱歉,如果我误解了您的问题。
有许多方法可以处理 Web 应用程序中的错误,但我个人发现,对于严格使用 AJAX 的 ASP.Net MVC 应用程序,最简单的方法是创建两种基本的异常类型。服务器异常和客户端异常。基本区别在于 ServerExceptions 是不应该发生的错误,用户不太可能解决它们。另一方面,ClientExceptions 的范围从“Permission Denied”到“Invalid email format”。
从那里您创建另一个类,它将代表您的应用程序将产生的所有 AJAX 响应的结构。例如,我使用如下内容:
public class JSONMessageObject
{
protected IList<ClientException> _ClientExceptions = null;
protected IList<ServerException> _ServerExceptions = null;
public bool Success { get; set; }
public bool LoggedIn { get; set; }
public bool IsAdmin { get; set; }
public object Data { get; set; }
public IList<ClientException> ClientExceptions {
get
{
if(_ClientExceptions == null) _ClientExceptions = new List<ClientException>();
return _ClientExceptions;
}
set
{
_ClientExceptions = value;
}
}
public IList<ServerException> ServerExceptions
{
get
{
if (_ServerExceptions == null) _ServerExceptions = new List<ServerException>();
return _ServerExceptions;
}
set
{
_ServerExceptions = value;
}
}
public string toJSON()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(new
{
Success = Success,
LoggedIn = LoggedIn,
IsAdmin = IsAdmin,
Data = Data,
ClientExceptions = from ex in ClientExceptions
select new
{
Source = ex.Source,
Value = ex.Value,
Message = ex.Message,
Number = ex.Number
},
ServerExceptions = from ex in ServerExceptions
select new
{
Message = ex.Message
}
});
}
}
为了让您的所有 AJAX 方法返回此结构,您需要避免Json()
直接使用该方法。相反,我创建了一个 BaseController 类,所有其他控制器都从该类继承,因此我可以使用以下调用。
private JsonResult Message(Classes.JSONMessageObject message)
{
return Json(message, "application/json", JsonRequestBehavior.AllowGet);
}
显然,创建一些额外的重载来简化一些更常见的返回更容易:
protected JsonResult Message()
{
return Message(false, false, false, null);
}
protected JsonResult Message(bool success)
{
return Message(success, false, false, null);
}
protected JsonResult Message(bool success, bool loggedIn)
{
return Message(success, loggedIn, false, null);
}
protected JsonResult Message(bool success, bool loggedIn, bool isAdmin)
{
return Message(success, loggedIn, isAdmin, null);
}
protected JsonResult Message(bool success, bool loggedIn, bool isAdmin, object data)
{
return Message(new Classes.JSONMessageObject()
{
Success = success,
LoggedIn = loggedIn,
IsAdmin = isAdmin,
Data = data
});
}
因此,这就是这种方法的真正魅力所在。由于您的方法响应都已标准化,这使您可以适当地响应任何 AJAX 调用,而无需知道它是什么调用。这意味着您不必在每个 Controller 方法中处理异常。让 Global.asax Application_Error 事件像这样捕获它们:
protected void Application_Error()
{
Exception ex = Server.GetLastError();
if (ex is Classes.ClientException)
{
OutputJSON(new Classes.JSONMessageObject
{
ClientExceptions = { (Classes.ClientException)ex }
});
}
else
{
WriteToDatabase(ex);
}
}
private void WriteToDatabase(Exception ex)
{
try
{
int errorRecordId;
// Save error to the database.
OutputJSON(new Classes.JSONMessageObject()
{
ServerExceptions = { new Classes.ServerException("Error saved to database. Error Id: " + errorRecordId.ToString()) }
});
}
catch
{
// Fallback...
}
}
一旦你有了这个设置,你就可以改变它JSONMessageObject
以更好地满足你对AdditionalInfo
类型的需求。或者更好的是,只需将其添加到 ClientException 类。
希望这可以帮助。