【问题标题】:Input date to webapi向 webapi 输入日期
【发布时间】:2018-11-05 10:29:39
【问题描述】:

我正在使用 webapi2。我在模型中有一个属性是开始日期,其数据类型是日期时间。我想以“dd-mm-yyyy”格式传递日期。但如果我发送,我会收到 400 个错误请求。你能帮帮我吗?请注意,我正在使用 Fluent 验证进行模型验证。

public class Item      
{
    public  DateTime? StartDate { get; set; }
    public  string Id { get; set; }
}

【问题讨论】:

  • 回复说什么?

标签: datetime asp.net-web-api2 model-binding fluentvalidation value-provider


【解决方案1】:

我想将日期传递为“dd-mm-yyyy”`

您有 3 个选项。

选项ISO8601

不要将其传递为“dd-mm-yyyy”。改为以 ISO8601 格式 (yyyy-MM-dd) 传递它。这是将DateTimes 序列化为字符串以及然后在层之间通信该字符串表示的正确方法。这种格式是一种标准的、广泛使用的、明确的,并且我所知道的几乎所有框架都内置了将DateTimes 输出为该格式并从该格式解析它们的机制。

显示格式为“dd-mm-yyyy”的DateTime 是表示层的问题,它应该保留在那里,而不是“渗入”其他应用程序层。

选项格式化程序

使用自定义代码(如 Json Converte 或 ActionFilterAttribute)来读取传入的 DateTime

选项字符串

接受一个字符串参数并在控制器的方法中处理您自己的解析。


老实说,我不推荐最后两个选项。而是使用ISO8601:一种标准的、明确的、被广泛接受的DateTime 通信方式。

【讨论】:

  • 谢谢@Igor。我相信动作过滤器不会工作,因为模型绑定失败。
【解决方案2】:

我创建了一个自定义值提供者工厂,并且正在使用默认模型绑定。

public class OrderValueProviderFactory<T> : ValueProviderFactory where T : class
    {
        public override IValueProvider GetValueProvider(HttpActionContext actionContext)
        {
            var querystring = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key.ToLower(), x => x.Value);
            return new OrderValueProvider<T>(querystring);
        }
    }
    public class OrderValueProvider<T> : IValueProvider
    {
        readonly Dictionary<string, string> querystring;

        public OrderValueProvider(Dictionary<string, string> _querystring)
        {
            querystring = _querystring;
        }
        public bool ContainsPrefix(string prefix)
        {
            return true;
        }

        public ValueProviderResult GetValue(string key)
        {
            T obj = (T)Activator.CreateInstance(typeof(T));
            PropertyInfo[] properties = typeof(T).GetProperties();
            foreach (var property in properties)
            {
                if (property.PropertyType == typeof(string))
                {
                    property.SetValue(obj, querystring.GetStringValue(property.Name.ToLower()));
                }
                else if (property.PropertyType == typeof(DateTime?))
                {
                    property.SetValue(obj, querystring.GetDateTimeValue(property.Name.ToLower()));
                }
                else if (property.PropertyType == typeof(int))
                {
                    property.SetValue(obj, querystring.GetIntValue(property.Name.ToLower()));
                }
            }
            return new ValueProviderResult(obj, "", CultureInfo.InvariantCulture);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多