Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
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
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)
–
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.