我正在构建一个自定义JsonConverter,用于模型类的属性。该模型用作Web API控制器中的输入参数。在我的JsonConverter中,如果我不喜欢输入,我会抛出FormatException
。
这是我模特的一部分:
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
,但这种情况并没有发生。我的转换器中会抛出异常,但是当媒体格式化程序运行时会发生这种情况。当我进入我的控制器时,异常被抛出,但我无法抓住它。所以即使我有一个糟糕的参数,我也会返回OK
。
如何让控制器看到转换器引发异常,以便我可以返回相应的响应?
答案 0 :(得分: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();
}