web-dev-qa-db-ja.com

型 'Microsoft.AspNetCore.Mvc.BadRequestObjectResult'を暗黙的に変換することはできません

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);
}

何が悪いのですか?

6
Robbie Mills

アクションの戻り値の型は、可能なBadRequestを考慮していません。

IList<Todo>を直接使用する代わりに、ジェネリックActionResultタイプでラップする必要があります。

public async Task<ActionResult<IList<Todo>>> Create(...

関連ドキュメント を以下に示します。

1

実際には、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)
3
Wiqi

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が自動的に実行するためです。 詳細はこちら

2
spottedmahn