2015-08-19 172 views
0

我有一个ASP.NET应用程序,我试图用ModelState.IsValid返回的错误信息,如果查询是有缺陷的。我想是这样的: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); 
    } 
} 

然而,问题是errorListstring类型和函数需要的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 
    } 
] 

回答

1

,我过去所使用的方法是从该方法返回一个HttpResponseMessage

这将允许您返回'错误'类型(例如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。

+0

完美。谢谢。这比我之前使用的'IQueryable'更有意义。 –

+0

我有一个简单的问题,如果语句的语法。如果我正在做一个与我的问题非常相似的if语句,但是我想删除数据库中的某个项目而不是返回值?我将如何修改它以调用不返回任何值的删除方法? –

+0

如果你已经删除了某些东西,你可以分开If语句而不是使用三元运算符(?:),删除后可以返回204“No Content”响应:return Request.CreateResponse(HttpStatusCode.NoContent); – Fermin

0

从您的消费者中思考。你将如何沟通和记录这个? “这个API调用返回一个Foo,除了返回Bar的情况外”。

可能的,但你需要更改返回类型的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