Введите дату в вебапи - PullRequest
0 голосов
/ 05 ноября 2018

Я использую webapi2. У меня есть свойство в модели это дата начала, тип данных которого - дата и время. Я хочу передать дату в формате "дд-мм-гггг". Но если я отправлю, я получу 400 плохих запросов. Не могли бы вы помочь мне. Обратите внимание, я использую Fluent проверки для проверки модели.

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

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Я создал фабрику провайдеров пользовательских значений и использую привязку модели по умолчанию.

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);
        }
    }
0 голосов
/ 05 ноября 2018

Я хочу передать дату как "дд-мм-гггг" `

У вас есть 3 варианта.

Опция ISO8601

Не передавайте это как "дд-мм-гггг". Вместо этого передайте его в формате ISO8601 (yyyy-MM-dd). Это правильный способ сериализации DateTime s в строку, а также для передачи этого строкового представления между уровнями. Этот формат является стандартным, широко используемым, однозначным, и почти все известные мне фреймворки имеют встроенные механизмы для вывода DateTime s в этот формат и анализа их из этого формата.

Отображение DateTime, отформатированного как «дд-мм-гггг», является проблемой уровня представления, и оно должно оставаться там, а не «сливаться» с другими уровнями приложения.

Опции форматирования

Используйте пользовательский код, такой как Json Converte или ActionFilterAttribute, чтобы прочитать входящий DateTime.

Опция String

Примите вместо этого строковый параметр и выполняйте собственный анализ внутри метода контроллера.


Я, честно говоря, не рекомендую последние 2 варианта. Вместо этого используйте ISO8601 : стандартный, однозначный, широко распространенный способ передачи DateTime.

...