4

了解我现在拥有的最新 webapi 位

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

我的客户是一个从响应中读取值的 MVC 网站。我终于让它从响应中读取 HttpError 对象,但是加载 ModelState 是......至少可以说不直观。

有没有更干净的方法来写这个?

var httpError = response.Read<HttpError>();
 var errors = httpError["ModelState"] as JObject;

 foreach (var error in errors)
 foreach (var message in error.Value.Values<string>())
 {
     modelState.AddModelError(error.Key, message);
 }
4

2 回答 2

3

正如您所确定的,虽然错误响应可以很容易地反序列化为 HttpError,但其中的 ModelState 值仅以 JObject 的形式结束。

您可能已经尝试过类似的方法:

var errors = ((JObject)errorMsg["ModelState"])
             .ToObject<ModelStateDictionary>();

或者可能:

var errors = ((JObject)errorMsg["ModelState"])
             .ToObject<Dictionary<string, ICollection<ModelError>>>();

并发现它不会转换。我能找到的最好的选择是:

var errors = ((JObject)errorMsg["ModelState"])
             .ToObject<Dictionary<string, IList<string>>>();

这使您的迭代更加整洁

foreach (var err in errors)
foreach (var msg in err.Value)
{
    modelStateDictionary.AddModelError(err.Key, msg);
}

正如我所看到的,问题是一个字符串不会反序列化为 ModelError 实例,并且由于 ModelErrorCollection 不幸隐藏了它的基类构造函数而进一步复杂化Collection(IList list)

于 2012-12-14T06:39:59.567 回答
0

您如何进行 API 调用?客户端?如果是这样,我注意到 Brad Wilson 在最近的演示中使用以下格式通过 jQuery 接收 AJAX 响应。这可能不是您想要的,但对我来说效果很好:

$.ajax({
    url: "/apicontorller/action/",
    contentType: "application/json",
    type: "POST",
    data: jsonData,
    statusCode: {
        200: function (data) {

        },
        404: function () {
            alert('404');
        },
        400: function () {
            alert('invalid');
        },
        500: function () {
            alert('error');
        },
        // ...
    }
});

这样做的好处是您可以处理实际的 HTTP 状态代码。根据我的经验,可以通过向谓词函数提供参数来访问错误消息/数据。我还在学习 REST 和 WebAPI 平台,所以如果有人能提供更好的实现,我当然欢迎!

于 2012-11-20T18:22:24.890 回答