Asp.netコア2.1プロジェクトがあり、コントローラーアクションで次のエラーが発生します。
型「Microsoft.AspNetCore.Mvc.BadRequestObjectResult」を「System.Collections.Generic.IList」に暗黙的に変換することはできません。明示的な変換が存在します(キャストがありませんか?)
これは私のコードです:
[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);
}
何が悪いのですか?
アクションの戻り値の型は、可能なBadRequest
を考慮していません。
IList<Todo>
を直接使用する代わりに、ジェネリックActionResult
タイプでラップする必要があります。
public async Task<ActionResult<IList<Todo>>> Create(...
関連ドキュメント を以下に示します。
実際には、ASP.NET Core 2.1以下ではIListではなくIActionResultを返す必要があります。
public async Task<IActionResult> Create([FromBody]TodoCreateViewModel model)
その後、動作します。
そして、@ amankkgによって提案されたASP.NET Core 2.1の場合、
public async Task<ActionResult<IList<Todo>>> Create([FromBody]TodoCreateViewModel model)
ASP.NET Core 2.1の場合、_ActionResult<T>
_を使用する必要がありますが、Interface
を使用できないという制限があります。
作品
_public async Task<ActionResult<List<Todo>>> Create(TodoCreateViewModel model)
_
動作しません
_public async Task<ActionResult<IList<Todo>>> Create(TodoCreateViewModel model)
_
C#は、インターフェイスでの暗黙のキャスト演算子をサポートしていません。したがって、ActionResultを使用するには、インターフェイスを具象型に変換する必要があります。たとえば、次の例でIEnumerableを使用しても機能しません
ソース: ActionResult type
補足:_[FromBody]
_は必要ありません。ASP.NETが自動的に実行するためです。 詳細はこちら 。