我正在使用 webapi2。我在模型中有一个属性是开始日期,其数据类型是日期时间。我想以“dd-mm-yyyy”格式传递日期。但如果我发送,我会收到 400 个错误请求。你能帮帮我吗?请注意,我正在使用 Fluent 验证进行模型验证。
public class Item
{
public DateTime? StartDate { get; set; }
public string Id { get; set; }
}
我正在使用 webapi2。我在模型中有一个属性是开始日期,其数据类型是日期时间。我想以“dd-mm-yyyy”格式传递日期。但如果我发送,我会收到 400 个错误请求。你能帮帮我吗?请注意,我正在使用 Fluent 验证进行模型验证。
public class Item
{
public DateTime? StartDate { get; set; }
public string Id { get; set; }
}
我已经创建了一个自定义值提供者工厂,并且正在使用默认模型绑定。
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);
}
}
我想将日期传递为“dd-mm-yyyy”`
你有 3 个选项。
ISO8601
不要将其传递为“dd-mm-yyyy”。改为以ISO8601格式 ( yyyy-MM-dd
) 传递它。DateTime
这是将s 序列化为字符串以及然后在层之间通信该字符串表示的正确方法。这种格式是一种标准的、广泛使用的、明确的,并且我所知道的几乎所有框架都内置了用于将DateTime
s 输出为该格式并从该格式解析它们的机制。
显示DateTime
格式为“dd-mm-yyyy”是表示层的问题,它应该留在那里而不是“渗入”其他应用程序层。
使用自定义代码(如 Json Converte 或ActionFilterAttribute
)来读取传入的DateTime
.
改为接受字符串参数并在控制器的方法中处理您自己的解析。
老实说,我不推荐最后两个选项。而是使用ISO8601:一种标准的、明确的、被广泛接受的交流DateTime
.