2016-07-27 13 views
2

モデルクラスの属性で使用するカスタムJsonConverterを構築しています。このモデルは、Web APIコントローラーの入力パラメーターとして使用されます。私のJsonConverterでは、入力が気に入らなければFormatExceptionを投げています。ここでJsonConverter属性でスローされた例外をキャッチする方法は?

は私のモデルの一部です:

public class PropertyVM 
{ 
    public string PropertyId { get; set; } 

    [JsonConverter(typeof(BoolConverter))] 
    public bool IsIncludedInSearch { get; set; } 
} 

そして、ここに私のコントローラのアクションです:

[HttpPost, Route("{propertyId}")] 
public IHttpActionResult UpdateProperty(string propertyId, [FromBody] PropertyVM property) 
{ 
    bool success; 
    try 
    { 
     property.PropertyId = propertyId; 
     success = _inventoryDAL.UpdateProperty(property); 
    } 
    catch (Exception ex) when 
    ( 
      ex is ArgumentException 
     || ex is ArgumentNullException 
     || ex is ArgumentOutOfRangeException 
     || ex is FormatException 
     || ex is NullReferenceException 
     || ex is OverflowException 
    ) 
    { 
     return BadRequest(ex.Message); 
    } 

    if (!success) 
    { 
     return NotFound(); 
    } 

    return Ok(); 
} 

私はIsIncludedInSearchに悪い値でコントローラを呼び出す場合、私は私の中でFormatExceptionをキャッチすることが期待しましたコントローラが、それは起こっていない。私のコンバータで例外がスローされますが、メディアフォーマッタが動作しているときに発生します。コントローラに入るまでに例外がスローされましたが、私はそれをキャッチできません。だから私は悪いparamを持っていてもOKを返す。

コントローラーに例外がスローされたことを確認してもらうには、適切な応答を返すことができますか?

答えて

1

モデルの検証エラーやその他の属性エラーを含むモデル状態エラーを確認する必要があります。だからあなたのコードでこれを行うことができます:

[HttpPost, Route("{propertyId}")] 
    public IHttpActionResult UpdateProperty(string propertyId, 
     [FromBody] PropertyVM property) 
    { 
     bool success = false; 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       property.PropertyId = propertyId; 
       success = _inventoryDAL.UpdateProperty(property); 
      } 
      catch (Exception ex) //business exception errors 
      { 
       return BadRequest(ex.Message); 
      } 

     } 
     else 
     { 
      var errors = ModelState.Select(x => x.Value.Errors) 
            .Where(y => y.Count > 0) 
            .ToList(); 
      return ResponseMessage(
       Request.CreateResponse(HttpStatusCode.BadRequest, errors)); 
     } 

     if (!success) 
     { 
      return NotFound(); 
     } 

     return Ok(); 
    } 
+0

完璧、ありがとう! – Val

関連する問題