Web API 2 在无效日期时间上抛出异常
Web API 2 throw exception on invalid datetimes
我将日期从 JavaScript 客户端发送到 ASP.NET Web API 2 Controller 作为 POST。
如果我发送一些不是日期的字符串,它会自动转换为 DateTime
最小值。我假设它默认为 default(DateTime
).
我想在进入我的控制器操作之前抛出一个异常。
什么是最好的方法?
我试过的:
我尝试创建 DateTimeConverterBase
的子类并将其添加到 HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.Converters
。但是只有 WriteJson
函数会被调用。从不ReadJson
根据我的断点
从 js 代码将日期作为字符串发送。在网络 api 控制器中,根据您的日期格式尝试 datetime.parse
或 datetime.tryparse
。
例如
public IHttpActionResult Get([FromUri]string date)
{
DateTime dt = new DateTime();
if (!DateTime.TryParse(date, null, System.Globalization.DateTimeStyles.RoundtripKind, out dt))
{
return BadRequest("incorrect input");
}
}
您可以创建一个操作并将其添加到您的管道中,该操作会检查 ModelState.IsValid 并将 400 状态返回给客户端。
我之前使用 Data Annotations 在网络中实现模型验证 API。这是一个很好的解决方案,因为它是面向方面的,所以完全不碍事。
这也是老MVC做模型验证的方式,作用是一样的。您只需将注释语法应用为模型的声明属性:
[Required]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] // or something similar
public DateTime? MyDate { get; set; }
然后您可以访问 CreateErrorResponse() 扩展提供的 ModelState static instance which automatically becomes available to your controller action by referencing the assembly containing your annotated models. You can then pass this into the appropriate overload,web API 将为您处理错误响应:
if (!ModelState.IsValid)
{
// bad request
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
I would like to throw an exception before going inside my controller action
如果您真的想这样做,那么您可以在 action filter by implementing OnActionExecuting() 中实现相同的验证。我还没有这样做,老实说,除了让你的控制器保持苗条之外,我看不出有什么好处。
我将日期从 JavaScript 客户端发送到 ASP.NET Web API 2 Controller 作为 POST。
如果我发送一些不是日期的字符串,它会自动转换为 DateTime
最小值。我假设它默认为 default(DateTime
).
我想在进入我的控制器操作之前抛出一个异常。 什么是最好的方法?
我试过的:
我尝试创建 DateTimeConverterBase
的子类并将其添加到 HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.Converters
。但是只有 WriteJson
函数会被调用。从不ReadJson
根据我的断点
从 js 代码将日期作为字符串发送。在网络 api 控制器中,根据您的日期格式尝试 datetime.parse
或 datetime.tryparse
。
例如
public IHttpActionResult Get([FromUri]string date)
{
DateTime dt = new DateTime();
if (!DateTime.TryParse(date, null, System.Globalization.DateTimeStyles.RoundtripKind, out dt))
{
return BadRequest("incorrect input");
}
}
您可以创建一个操作并将其添加到您的管道中,该操作会检查 ModelState.IsValid 并将 400 状态返回给客户端。
我之前使用 Data Annotations 在网络中实现模型验证 API。这是一个很好的解决方案,因为它是面向方面的,所以完全不碍事。
这也是老MVC做模型验证的方式,作用是一样的。您只需将注释语法应用为模型的声明属性:
[Required]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] // or something similar
public DateTime? MyDate { get; set; }
然后您可以访问 CreateErrorResponse() 扩展提供的 ModelState static instance which automatically becomes available to your controller action by referencing the assembly containing your annotated models. You can then pass this into the appropriate overload,web API 将为您处理错误响应:
if (!ModelState.IsValid)
{
// bad request
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
I would like to throw an exception before going inside my controller action
如果您真的想这样做,那么您可以在 action filter by implementing OnActionExecuting() 中实现相同的验证。我还没有这样做,老实说,除了让你的控制器保持苗条之外,我看不出有什么好处。