0

Asp.Net Core API を開発しています。

私のコントローラー宣言

[ApiController]
public class BarController : Controller
{
    ...
}

私のエンドポイントは次のようになります

[HttpPost, Route("bars")]
public async Task<ActionResult> DoAsync(
    [FromBody] UpdateBars command)
{
    // Do something with the command
    return Ok(result);
}

コマンドは次のようになります

public class UpdateBars
{
    [Required]
    public IEnumerable<string> Ids { get; set; }

    // ... more properties
}

互換性レベルは 2.1 に設定されています

public IServiceProvider ConfigureSharedServices(IServiceCollection services)
{
    // ...
    services.AddMvc()
        .AddControllersAsServices()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    // ...
}

古い質問: Ids パラメータが欠落している 400 の不正なリクエストが返されることを期待していましたが、バインディング エラーが返されませんでした。私は何を間違っていますか?

更新された質問: Ids パラメータが欠落しているか空である 400 の不正なリクエストが返されることを期待しています。パラメーターが欠落している (null) 場合、応答は期待どおりですが、空のコレクションの場合は 200 ok を返します。パラメータが存在するが空のときに悪いリクエストを受け取るように何かを変更することは可能ですか?

4

2 に答える 2

0

[ApiController]コントローラーに属性を設定していない可能性があります。

デフォルトでは、検証は「自動」ではありません。その属性をコントローラーに配置したくない場合は、次の方法でモデルを自分で検証する必要があります。

[HttpPost, Route("bars")]
public async Task<ActionResult> DoAsync(
    [FromBody] UpdateBars command)
{
    if (!ModelState.IsValid)
    {
       return BadRequest(ModelState);
    }
    // Do something with the command
    return Ok(result);
}

そのようにしてより多くの制御を行うことができますが、モデルの状態で を返す必要がある場合は、コントローラーBadRequestに を配置すると自動的に行わ[ApiController]れます。

また、その場合、すべてのアクション パラメータを としてマークする[FromBody]ため、その属性を params に配置する必要はありません。

于 2020-05-21T19:38:15.467 に答える