处理抛出Controller方法参数的构造函数?

时间:2017-02-11 22:47:27

标签: c# asp.net-web-api asp.net-core asp.net-core-webapi

我正在制作一个小型的Asp.net核心Web API项目。我有一个模型对象,如下所示:

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参数的值为&#39; null&#39;。我可以设置asp.net做类似的事情吗?或者我必须重写Order构造函数以不抛出?

1 个答案:

答案 0 :(得分:4)

使用DataAnnotation来做你正在做的MVC方式。

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

然后在你的控制器中执行以下操作:

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

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

另一方面是,如果您决定在MVC Web应用程序(带有视图)中使用Order模型,则会因Range属性而获得客户端验证。