ModelState.IsValid返回不正确的类型

时间:2015-08-19 10:25:10

标签: asp.net asp.net-web-api modelstate

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

[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);
    }
}

然而,问题是errorList的类型为string,函数期望返回类型为ToDoTable,这是我创建的类。如何获得正确的返回类型?或者我是否需要更改功能的期望?我是否必须将该方法添加到类中(甚至不确定它是否可行)?

ModelState.IsValid为真时,该函数返回类对象,其中包含从数据库收集的信息,我查询并将其输出为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
  }
]

2 个答案:

答案 0 :(得分:1)

我过去使用过的方法是从方法中返回HttpResponseMessage

这将允许您返回错误&#39;类型(例如https://tools.ietf.org/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的情况下处理不同的响应类型和状态。

答案 1 :(得分:0)

向消费者思考。你打算如何沟通和记录这个? &#34;此API调用返回Foo,除非它返回Bar&#34;。

是可能的,但是您需要将返回类型更改为IHttpActionResultthrow new HttpResponseException

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

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

    public int? RecordCount { get; set; }

    public T Content { get; set; }

    public ErrorDetail Error { get; set; }
}

这样,所有操作都可以从静态类型(想想单元测试)中获益,并以同样的方式返回成功和失败。

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