繁体   English   中英

controller 动作中的日期参数

[英]Date parameter in controller action

我正在 dotnet 核心中编写 API。 我希望我的 controller 操作将日期(例如'2019-11-12')作为参数,因此用户不必提供完整的datetime

我有以下内容:

[HttpGet]
public async Task<ActionResult<IEnumerable<DogDto>>> GetDogsForKennelOnDate([FromQuery]string kennelName, [FromQuery]DateTime birthDate)
{...}

在我看来,这可能是一个常见的用例,但我一直无法在 SO 上找到解决方案。 你能帮我吗?

编辑:

我应该将string作为参数,然后从该string创建一个新的DateTime吗? 这是正确的方法吗?

您为此收到编译错误的原因:

[HttpGet]
public async Task<ActionResult<IEnumerable<DogDto>>> GetDogsForKennelOnDate([FromQuery]string kennelName, [FromQuery]DateTime.Date birthDate)
{...}

是因为编译器期望你为birthDate参数定义数据类型,但DateTime.Date不是数据类型,而是DateTime数据类型的属性。

现在考虑这个,在 .NET Core 2.2 上测试:

[HttpGet]
public async Task<ActionResult<IEnumerable<DogDto>>> GetDogsForKennelOnDate([FromQuery]string kennelName, [FromQuery]DateTime birthDate)
{...}

查询字符串参数:

birthDate=2019-11-12

成功绑定到操作中的birthDate 参数(小时、分钟和秒为0)。 所以我认为你假设用户必须提供完整的日期和时间是错误的。

注意:DateTime.Date 属性本身是一个 DateTime,其时间值设置为午夜 12:00:00 (00:00:00); 请参阅https://docs.microsoft.com/en-us/dotnet/api/system.datetime.date?view=netcore-2.2

编辑:与其让用户无法在查询字符串参数中包含时间,不如忽略它(我的偏好是用户友好):

[HttpGet]
public async Task<ActionResult<IEnumerable<DogDto>>> GetDogsForKennelOnDate([FromQuery]string kennelName, [FromQuery]DateTime birthDate)
{
    DateTime birthDateDate = birthDate.Date;
}

或者,您可以验证小时、分钟和秒是否为 0,并创建一个 model state 错误(如果不是用户友好型)。 您可以使用自定义验证属性执行此操作:

public sealed class DateAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (validationContext == null)
        {
            throw new ArgumentNullException(nameof(validationContext));
        }

        if (!(value is DateTime))
        {
            return new ValidationResult($"Not a DateTime object ({value}).");
        }

        DateTime date = (DateTime)value;

        if (date.Date != date)
        {
            return new ValidationResult($"Do not specify the time ({value}).");
        }

        return ValidationResult.Success;
    }
}

用法:

[HttpGet]
public async Task<ActionResult<IEnumerable<DogDto>>> GetDogsForKennelOnDate([FromQuery]string kennelName, [FromQuery] [Date] DateTime birthDate)
{
    ...
}

这现在将成功验证:

birthDate=2019-11-12

但这会失败:

birthDate=2019-11-12 11:22:33

但是,这仍然会成功:

birthDate=2019-11-12 00:00:00

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM