0

我有这样的方法:

[HttpGet]
[Authorize]
public JsonResult SomeMethod()
    object responseJson;
    try
    {
        //All good
        responseJson = new { Data = someData };
    }
    catch (Exception ex)
    {
        //AdditionalInfo is not returned
        responseJson = new { Error = errors, AdditionalInfo = additionalInfo };
    }

    return Json(responseJson, JsonRequestBehavior.AllowGet);
}

如果该方法没有返回错误,我解析 responseJson 没有问题,但如果响应是在 Catch 中创建的,我无法访问 AdditionalInfo。

我可以提供更多细节,但在我开始第一篇很长的帖子之前,我想确保我没有遗漏一些明显的东西。

谢谢!西蒙

4

1 回答 1

0

抱歉,如果我误解了您的问题。

有许多方法可以处理 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 类。

希望这可以帮助。

于 2013-06-29T04:24:14.350 回答