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

Handling a constructor that throws in a Controller method parameter?

我正在制作一个小型 Asp.net Core 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 方法可以正常工作。但是,如果我传递一个负数的 OrderOrder 构造函数会抛出一个异常,该异常未被我的应用程序或 asp.net.

处理

我该怎么做才能优雅地处理这个异常?我注意到,如果我传递一个语法无效的请求(例如,格式错误的 JSON),也不例外,并且 order 参数的值为 'null'。我可以设置 asp.net 来做类似的事情吗?还是我必须重写 Order 构造函数才能不抛出?

使用 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 网络应用程序(带有视图)中使用 Order 模型,由于 Range 属性,您将获得客户端验证。