我有一个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
}
]
答案 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;。
是可能的,但是您需要将返回类型更改为IHttpActionResult
或throw 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 API,Best practice to return errors in ASP.NET Web API,Storing result of Web API call into Generic type class,