处理抛出 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
方法可以正常工作。但是,如果我传递一个负数的 Order
,Order
构造函数会抛出一个异常,该异常未被我的应用程序或 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
属性,您将获得客户端验证。
我正在制作一个小型 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
方法可以正常工作。但是,如果我传递一个负数的 Order
,Order
构造函数会抛出一个异常,该异常未被我的应用程序或 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
属性,您将获得客户端验证。