【问题标题】:Asp.Net WebApi model binding nullable datetimeAsp.Net WebApi 模型绑定可为空的日期时间
【发布时间】: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 方法工作正常,除了一种情况 - 当客户端显式将空值传递给 ChartPageRequestDateTime? 属性时,例如:

/rating?from=2016-07-08 12:01:55.604&to=null

在这种情况下,ValidateModelState 属性注册了无效的 ModelState,并带有以下消息:The value 'null' is not valid for To

我发现这种问题非常流行,但在不创建自定义模型绑定器的情况下没有找到任何好的解决方法。那么问题来了:

  1. 还有没有自定义模型绑定器的另一种方法?

  2. 如果没有,我怎样才能只接受“接受空”作业并将 DateTime 解析留给我的自定义活页夹中的默认活页夹?

  3. 我是否需要接受这些空值?所有客户都是我的同事开发的,所以我可以强迫他们不发送。毕竟这是一种好习惯吗?

谢谢!

【问题讨论】:

  • 不要在查询字符串中包含该值。如果您有不受您控制的外部客户端,那么您应该通知他们或更新文档,以便他们知道应该省略空值。这适用于您通过的所有内容,而不仅仅是这个日期时间。如果你用int试试?或者一个字符串,你也会得到意想不到的结果(int 错误,可能是字符串 assinment 的文字“null”字符串)。
  • @Igor,我会更新我的问题并询问这是否是好的做法。谢谢
  • 检查this answer,如果你想在查询字符串中包含它,即使没有值:。 /rating?from=2016-07-08 12:01:55.604&amp;to=%00。如果没有必要,我建议忽略它。至于最佳实践是什么,这可能是一个见仁见智的问题。
  • 哦,再次感谢,伙计!我一直认为其他原始类型不存在这个问题,我刚刚意识到这不是真的 :) 好的,所以这个问题根本与传递空值有关。看来我需要与 api 客户交谈;)

标签: c# datetime asp.net-web-api model-binding


【解决方案1】:

这个方法我没有验证,不过我想你可以自己尝试解析一下,虽然我觉得不是很方便,先用字符串获取To

public string To { get; set; }

并给另一个属性DateTimeTo 并自己解析To

public DateTime? DateTimeTo { get; set; }

public void ParseTo()
{
    if(To.ToLower() == "null")
        DateTimeTo = null;
    else
        DateTimeTo = Convert.ToDateTime(To); 
}

DateTimeTo 是解析后的结果属性。

我最近遇到了一些 Asp.Net WebApi 解析主体问题,在某些情况下解析效果不佳。

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 2013-10-11
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多