【发布时间】:2017-11-12 20:57:03
【问题描述】:
你好,
我有 api GET 方法 /rating (ASP.Net WebApi 2.1),它接受 ChartPageRequest 类型的对象:
// comments're removed for readability
public sealed class ChartPageRequest
{
public DateTime? From { get; set; }
public DateTime? To { get; set; }
public string Cursor { get; set; }
[Range(-100, 100)]
public int Take { get; set; } = 10;
}
/rating 方法具有以下签名:
[HttpGet]
[Route("rating")]
[ResponseType(typeof(ChartPage))]
[ValidateModelState]
public async Task<IHttpActionResult> GetTranslationRatingChartAsync([ModelBinder] ChartPageRequest model)
{
// body here
}
而ValidateModelState 属性只是一个自定义属性,它在 ModelState 无效时返回自定义响应。除了HttpActionContext.ModelState.IsValid 属性,它不会自行检查任何内容。
此 api 方法工作正常,除了一种情况 - 当客户端显式将空值传递给 ChartPageRequest 的 DateTime? 属性时,例如:
/rating?from=2016-07-08 12:01:55.604&to=null
在这种情况下,ValidateModelState 属性注册了无效的 ModelState,并带有以下消息:The value 'null' is not valid for To。
我发现这种问题非常流行,但在不创建自定义模型绑定器的情况下没有找到任何好的解决方法。那么问题来了:
还有没有自定义模型绑定器的另一种方法?
如果没有,我怎样才能只接受“接受空”作业并将 DateTime 解析留给我的自定义活页夹中的默认活页夹?
我是否需要接受这些空值?所有客户都是我的同事开发的,所以我可以强迫他们不发送。毕竟这是一种好习惯吗?
谢谢!
【问题讨论】:
-
不要在查询字符串中包含该值。如果您有不受您控制的外部客户端,那么您应该通知他们或更新文档,以便他们知道应该省略空值。这适用于您通过的所有内容,而不仅仅是这个日期时间。如果你用int试试?或者一个字符串,你也会得到意想不到的结果(int 错误,可能是字符串 assinment 的文字“null”字符串)。
-
@Igor,我会更新我的问题并询问这是否是好的做法。谢谢
-
检查this answer,如果你想在查询字符串中包含它,即使没有值:。
/rating?from=2016-07-08 12:01:55.604&to=%00。如果没有必要,我建议忽略它。至于最佳实践是什么,这可能是一个见仁见智的问题。 -
哦,再次感谢,伙计!我一直认为其他原始类型不存在这个问题,我刚刚意识到这不是真的 :) 好的,所以这个问题根本与传递空值有关。看来我需要与 api 客户交谈;)
标签: c# datetime asp.net-web-api model-binding