我有一個CotractResolver
返回屬性爲每個DateTime
屬性的時間部分(以便用戶可以分別設置時間)。 我有一個TimeValueProvider
具有SetValue
方法如下:json.net IValueProvider SetValue拋出的異常丟失
public void SetValue(object target, object value)
{
try
{
var time = value as string;
var originalValue = _propertyInfo.GetValue(target);
if (value == null)
{
_propertyInfo.SetValue(target, originalValue);
}
else if (string.IsNullOrWhiteSpace(time))
{
var originalDateTime = (DateTime?) originalValue ?? SqlDateTime.MinValue.Value;
_propertyInfo.SetValue(target,
new DateTime(originalDateTime.Year, originalDateTime.Month, originalDateTime.Day, 0, 0, 0));
}
else
{
var currentValue = GetCurrentValue(_propertyInfo.GetValue(target));
var convertedDate = TimeSpan.Parse(time, new DateTimeFormatInfo {LongTimePattern = "HH:mm:ss"});
var finalValue = new DateTime(currentValue.Year, currentValue.Month, currentValue.Day,
convertedDate.Hours, convertedDate.Days, convertedDate.Seconds);
_propertyInfo.SetValue(target, finalValue);
}
}
catch (InvalidDataException)
{
throw new ValidationException(new[]
{
new ValidationError
{
ErrorMessage = "Time is not correct",
FieldName = _propertyInfo.Name,
TypeName = _propertyInfo.DeclaringType.FullName
}
});
}
}
的問題是,每當我路過一個無效的數量隨着時間的說,例如99:99的異常被拋出TimeSpan.Parse
但我不在外面得到它這個方法因此Json.Net
反序列化對象。 我嘲笑了我的代碼,找不到導致此類行爲的任何常規異常處理。 我在這裏錯過了關於合同解析器和價值提供者的東西嗎?
更新:這裏就是我已經配置Json.net
:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new EntityContractResolver();
config.Formatters.JsonFormatter.SerializerSettings.ObjectCreationHandling = ObjectCreationHandling.Replace;
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
請問您可以將問題擴展到完整[mcve]嗎?我試圖在控制檯應用程序中重現您的問題,但無法查看https://dotnetfiddle.net/Edraqz。我所觀察到的是您的'TimeValueProvider.SetValue()'方法未被調用,因爲Json.NET無法解析JSON字符串 - 並且只有在值被成功反序列化後才調用SetValue()。也許你想使用[自定義轉換器](http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm)來代替? – dbc