返回带有 BadRequestResult / BadRequestErrorMessageResult 的数据对象

Wat*_* v2 6 .net asp.net asp.net-web-api

我想返回一个数据对象,其中包含带有 aBadRequestErrorMessageResultBadRequestErrorMessageResult对象的错误详细信息,如下所示:

public IHttpActionResult Action(Model model)
{
  var validationResult = model.Validate();
  if (validationResult.Successful)
  {
    // this one's okay; it supports sending data with a 200
    return Ok(validationResult);
  }
  else
  {
    // However, how do I return a custom data object here
    // like so?
    // No such overload, I wish there was

    // return BadRequest(validationResult);
  }
}
Run Code Online (Sandbox Code Playgroud)

该方法仅有的三个重载ApiController.BadRequest()是:

1. BadRequest();
2. BadRequest(string message);
3. BadRequest(ModelStateDictionary modelState);
Run Code Online (Sandbox Code Playgroud)

即使使用#3,模型状态字典最终也是一个一层又一层的深层集合,但在其底部是一堆,其中KeyValuePair<string, ModelError>每个字典ModelError也只有一个string或一个Exception对象。

因此,即使使用#3,我们也只能打包string要发送的对象,而不是像我想要的那样打包自定义对象。

我真的不是在问我该如何解决这种情况。我的问题是:.NET API 中是否存在重载或其他方式来将带有错误请求HTTP 状态代码的对象发送到客户端?

我正在使用面向 .NET Framework 版本 4.6.1 的 ASP.NET Web API 版本 5.2.4。

Zac*_*her 9

您可以使用该Content<T>(...)方法来执行此操作。它返回一个NegotiatedContentResult,它根据请求标头(例如 json、xml)进行序列化,并允许您指定一个HttpStatusCode.

你可以这样使用它:

return Content(HttpStatusCode.BadRequest, myObject);
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您可以BadRequest<T>(T obj)在控制器中创建自己的方法作为包装器,这样您就可以根据需要调用它:

public IHttpActionResult BadRequest<T>(T obj)
{
    return Content(HttpStatusCode.BadRequest, obj);
}

public IHttpActionResult Action()
{
    // do whatever validation here.
    var validationResult = Validate();

    // then return a bad request
    return BadRequest(validationResult);
}
Run Code Online (Sandbox Code Playgroud)