Asp.Net WebApi模型绑定可空日期时间

时间:2016-09-19 14:04:18

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

你好,

我有api GET-method /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属性外,它不会自行检查任何内容。

除了一种情况 - 当客户端显式地将空值传递给DateTime?的{​​{1}}属性时,此api方法正常工作,例如:

ChartPageRequest

在这种情况下,ValidateModelState属性使用以下消息注册无效的ModelState:/rating?from=2016-07-08 12:01:55.604&to=null

我发现这种问题很受欢迎,但在没有创建自定义模型绑定器的情况下没有找到任何好的解决方法。所以这是问题:

  1. 是否有其他方法没有自定义模型绑定器?

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

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

  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

我没有验证这种方法,但我想你可以自己尝试解析它,虽然我认为这不是一种方便的方法,首先使用字符串来获取To:< / p>

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解析体问题,解析在某些情况下并不能很好地工作。