0

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

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

2 回答 2

0

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

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);
        }
    }
于 2018-11-08T14:07:02.007 回答
0

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

你有 3 个选项。

选项ISO8601

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

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

选项格式化程序

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

选项字符串

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


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

于 2018-11-05T11:25:56.250 回答