2017-02-11 14 views
2

私は小さなAsp.net Core Web APIプロジェクトを作っています。Controllerメソッドのパラメータをスローするコンストラクタを処理しますか?

public class Order 
{ 
    public readonly int Quantity; 

    public Order(int quantity) 
    { 
     if (quantity < 0) 
     { 
      throw new ArgumentException("quantity"); 
     } 
     this.Quantity = quantity; 
    } 
} 

とこのようになりますコントローラ:

[Route("api/[controller]")] 
public class OrderController : Controller 
{ 
    [HttpPost] 
    public IActionResult Post([FromBody]Order order) 
    { 
     // Do stuff... 
     return this.StatusCode(200); 
    } 
} 

私はポジティブ量でOrderオブジェクトを渡すと、Post方法が正しく動作する私はこのようになりますモデルオブジェクトを持っています。しかし、Orderを負の数量で渡すと、Orderコンストラクタは、アプリケーションまたはasp.netによって処理されない例外をスローします。

この例外を適切に処理するにはどうすればよいですか?私は無効な構文(例えばJSONがひどく形成されているなど)でリクエストを渡すと例外がなく、orderパラメータの値が 'null'であることがわかります。同様のことをasp.netに設定できますか?または、投げないようにOrderコンストラクタを書き直す必要がありますか?

+0

すぐにGoogleがこれを見つけました:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling多分あなたは最初にドキュメントを見てください... –

+1

"web apiモデルバリデーション "。モデルが無効な場合は、エラーではなく、400 BAD REQUEST応答を返す必要があります。モデルの検証に例外を使用しないでください。 – Amy

+0

@CallumLinington私は開発者の例外ページを表示したくない、または(必然的に)400を返す必要があります。引数を 'null 'または同様に設定してメソッドを実行したいと思います。 – Oliver

答えて

4

DataAnnotationを使用して、MVCのやり方をしてください。

public class Order 
{ 
    [Range(1, Int32.MaxValue)] 
    public int Quantity { get; set; } 
} 

次に、あなたのコントローラでこれを行う:あなたが今までに(ビューの)MVC WebアプリケーションでOrderモデルを使用することにした場合

[HttpPost] 
public IActionResult Post([FromBody]Order order) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
    } 

    // Do stuff... 
    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

他のプラス側は、あなたがクライアント側を取得しますRange属性のために検証されました。

+1

ありがとう、私はこれが最善の方法だと思います。私はモデルがMVC以外のコードと共有されていたので、コンストラクタからの例外を残したいと思っていましたが、そのパターンは意味がありましたが、ここではそれほどうまくいきません。 – Oliver

+1

APIで使用されるモデルコードを他の場所で共有することは必ずしも理想的ではありません。通常は、ViewModelを定義してAPIワイヤフォーマットを定義し、このViewModelでモデル検証を指定します。それが有効な場合は、コントローラー内の基になるモデルタイプにマップします。 – ssmith

+0

@ssmith MVCで「モデル」という言葉を使うとき、私はいつもあなたがビューに渡してドメインモデルではないことを意味します。私はビューモデルと呼ぶ人もいますが、MVCにはViewModelがないので、それは離れていますが、それはmvvmに存在します。とにかく、私たちは同じページにいます。 – CodingYoshi

関連する問題