I have an asp.net core 2.1 project and I'm getting the following error in my controller action:
Cannot implicitly convert type 'Microsoft.AspNetCore.Mvc.BadRequestObjectResult' to 'System.Collections.Generic.IList'. An explicit conversion exists (are you missing a cast?)
This is my code:
[HttpPost("create")]
[ProducesResponseType(201, Type = typeof(Todo))]
[ProducesResponseType(400)]
public async Task<IList<Todo>> Create([FromBody]TodoCreateViewModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);   // This is the line that causes the intellisense error
    }
    await _todoRepository.AddTodo(model);
    return await GetActiveTodosForUser();
}
[HttpGet("GetActiveTodosForUser")]
[ProducesResponseType(200)]
[ProducesResponseType(404)]
public async Task<IList<Todo>> GetActiveTodosForUser(string UserId = "")
{
    if (string.IsNullOrEmpty(UserId))
    {
        UserId = HttpContext.User.FindFirstValue(ClaimTypes.Sid);
    }
    return await _todoRepository.GetAll(UserId, false);
}
What am I doing wrong?
Your action return type does not take in mind possible BadRequest.
Instead of direct usage of IList<Todo> you need to wrap it with generic ActionResult type.
public async Task<ActionResult<IList<Todo>>> Create(...
Here are the related docs.
For ASP.NET Core 2.1, you should use ActionResult<T> but there is a limitation with Interface's.
This Works
public ActionResult<IList<string>> Create()
{  
    return new List<string> { "value1", "value2" };
}
Doesn't Work
public ActionResult<IList<string>> Create()
{
    //DOESN'T COMPILE:
    //Error CS0029  Cannot implicitly convert type
    //'System.Collections.Generic.IList<string>' 
    //to 'Microsoft.AspNetCore.Mvc.ActionResult<System.Collections.Generic.IList<string>>'
    //the cast here is for demo purposes.
    //the problem will usually arise from a dependency that returns
    //an interface.
    var result = new List<string> { "value1", "value2" }
                     as IList<string>;
    return result;
}
C# doesn't support implicit cast operators on interfaces. Consequently, conversion of the interface to a concrete type is necessary to use ActionResult.
Source: ActionResult type
Sidenote: you don't need [FromBody] as ASP.NET will do that automatically.  More here.
Actually you need to return IActionResult instead of IList for below ASP.NET Core 2.1,
public async Task<IActionResult> Create([FromBody]TodoCreateViewModel model)
Then it will work.
And for ASP.NET Core 2.1 as suggested by @amankkg,
public async Task<ActionResult<IList<Todo>>> Create([FromBody]TodoCreateViewModel model)
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With