ModelState.IsValid 返回不正确的类型

ModelState.IsValid Returning Incorrect Type

我有一个 ASP.NET 应用程序,如果查询有缺陷,我会尝试使用 ModelState.IsValid 到 return 错误消息。我试过这样的事情:

[HttpGet]
[Route("")]
[Route("{id:int}")]
public IQueryable<ToDoTable> Get(int id = -1)
{
    if (!ModelState.IsValid)
    {
        var errorList = (from item in ModelState
                         where item.Value.Errors.Any()
                         select item.Value.Errors[0].ErrorMessage).ToList();
        return errorList.AsQueryable();
    }
    else
    {
        if (id == -1)
            return db.ToDoTables;
        else
            return db.ToDoTables.Where(lt => lt.ID == id);
    }
}

但是,问题是 errorListstring 类型,并且该函数需要 return 类型的 ToDoTable,class我做了。如何获得正确的 return 类型?还是我需要改变功能的期望?我是否必须将该方法添加到 class 中(甚至不确定是否可行)?

ModelState.IsValid 为真时,该函数是 returning class 对象,其中包含从我正在查询的数据库中收集的信息,并将其输出为 JSON。示例:

[
  {
    "ID": 11,
    "Title": "this is a test",
    "Description": "this is specifically to test the put method",
    "Due": null,
    "Completed": true
  },
  {
    "ID": 15,
    "Title": "date test",
    "Description": "datetime format",
    "Due": "2015-08-10T02:41:29",
    "Completed": true
  }
]

从消费者的角度思考。你打算如何沟通和记录这个? "This API call returns a Foo, except for in cases where it returns Bar".

可能的,但是您需要将 return 类型更改为 IHttpActionResult 或 .

(可以说)更好的方法是引入一个具有可为空属性的响应容器,如下所示:

public class ApiResponse<T>
{
    public bool Success { get; set; }

    public int? RecordCount { get; set; }

    public T Content { get; set; }

    public ErrorDetail Error { get; set; }
}

通过这种方式,您的所有操作都可以从静态类型化(想想单元测试)中获益,并且 return 成功和失败的方式相同。

相关:Handle ModelState Validation in ASP.NET Web API, Best practice to return errors in ASP.NET Web API, Storing result of Web API call into Generic type class

我过去使用的一种方法是从方法中 return HttpResponseMessage

这将允许您 return 'error' 类型(例如 https://datatracker.ietf.org/doc/html/draft-nottingham-http-problem)和适当的响应代码(例如 400)。

您的函数将变为:

[HttpGet]
[Route("")]
[Route("{id:int}")]
public HttpResponseMessage Get(int id = -1)
{
    if (!ModelState.IsValid)
    {
        var errorList = (from item in ModelState
                         where item.Value.Errors.Any()
                         select item.Value.Errors[0].ErrorMessage).ToList();
        return Request.CreateResponse(HttpStatusCode.BadRequest, errorList);
    }
    else
    {

        var tables = (id == -1) ? db.ToDoTables : db.ToDoTables.Where(lt => lt.ID == id);
        return Request.CreateResponse(HttpStatusCode.OK, tables);
    }
}

这意味着您可以在不抛出 HttpResponseExceptions 的情况下应对不同的响应类型和状态。