我有一個POCO類,它從幾個類繼承,爲它提供INotifyPropertyChanged和DataAnnotations支持。當的WebAPI返回法院的一個實例中,串行器JSON.NET在ModelPropertyAnnotationsValidation匿名方法委託扼流圈與一個異常(示出從Fiddler中RAW響應):WebApi中的JSON.NET序列化錯誤
{「消息」:「發生錯誤。 「,」ExceptionMessage「:」 'ObjectContent`1'類型未能序列化響應正文 內容類型'application/json; charset = utf-8'。「,」ExceptionType「:」System.InvalidOperationException 「,」StackTrace「:null,」InnerException「:{」Message「:」發生了 錯誤。「,」ExceptionMessage「:」從 獲取值時出錯「CS $ <> 9_ CachedAnonymousMethodDelegate5' 上 'Sample.Data.Models.Court' 「」 ExceptionType。 「:」 Newtonsoft.Json.JsonSerializationException 「 」堆棧跟蹤「:」 在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(對象 靶個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter 作家,對象的值,JsonContainerContract合同,JsonProperty 構件,JsonProperty屬性,JsonContract & memberContract,對象& memberValue個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer,Object va略,JsonObjectContract合同,JsonProperty 構件,JsonContainerContract collectionContract,JsonProperty containerProperty個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter 作家,對象的值,JsonContract valueContract,JsonProperty構件, JsonContainerContract containerContract,JsonProperty containerProperty個)\ r \ n在 Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(jsonWriter jsonWriter,對象的值)\ r \ n在 Newtonsoft.Json.JsonSerializer.SerializeInternal(jsonWriter jsonWriter,對象的值)\ r \ n at System.Net.Http.Formatting.JsonMediaTypeFormatter。 <>Ç _DisplayClassd.b_ C(個)\ r \ n 在System.Threading.Tasks.TaskHelpers.RunSynchronously(動作的動作, 的CancellationToken令牌) 「 」的InnerException「:{ 」消息「:」 一個錯誤已 發生 「」ExceptionMessage。「:」 通用語言運行時檢測到 無效 節目 「, 」ExceptionType「: 」System.InvalidProgramException「, 」堆棧跟蹤「:」 在GetCS $ <> 9 _CachedAnonymousMethodDelegate5(對象) \ r \ n在 Newtonsoft.Json.Serialization.DynamicValueProvider。的GetValue(對象 目標)「}}}
法院類(節錄爲了簡潔):
using System;
using System.Collections.Generic;
using Sample.Data.Models.Infrastructure;
namespace Sample.Data.Models
{
[Serializable]
public partial class Court : ModelPropertyAnnotationsValidation
{
public Court()
{
}
private int _courtID;
public int CourtID
{
get { return _courtID; }
set
{
_courtID = value;
OnPropertyChanged(() => CourtID);
}
}
}
}
這裏是繼承抽象類,其中的問題所在(如果我改變對public string this[string columnName]
吸氣劑返回一個空字符串,它的工作原理:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace Sample.Data.Models.Infrastructure
{
public abstract class ModelPropertyAnnotationsValidation : ModelBase
{
public string this[string columnName]
{
get
{
var type = GetType();
var modelProperties = TypeDescriptor.GetProperties(type).Cast<PropertyDescriptor>();
var enumerable = from modelProperty in modelProperties.Where(modelProp => modelProp.Name == columnName)
from attribute in modelProperty.Attributes.OfType<ValidationAttribute>().Where(attribute => !attribute.IsValid(modelProperty.GetValue(this)))
select attribute.ErrorMessage;
return enumerable.FirstOrDefault();
}
private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html
}
public string Error
{
get { return null; }
private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html
}
public virtual bool IsValid
{
get
{
var validationContext = new ValidationContext(this, null, null);
var valid = Validator.TryValidateObject(this, validationContext, null, validateAllProperties: true);
return valid;
}
private set { ; } //http://developerstreasure.blogspot.com/2010/05/systemruntimeserializationinvaliddataco.html
}
}
}
以及物品是否完整,這裏是模型庫:
using System;
using System.ComponentModel;
using System.Linq.Expressions;
namespace Sample.Data.Models.Infrastructure
{
public abstract class ModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(Expression<Func<object>> property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(BindingHelper.Name(property)));
}
}
}
}
而且的WebAPI控制器(這是超級簡單的了):
using System.Web.Http;
using Sample.Data.Models;
namespace Sample.Services.Api.Controllers
{
public class CourtsController : ApiController
{
// GET api/values
public Court Get()
{
return new Court {Abbreviation = "TEST", FullName = "Test Court", Active = true};
}
}
}
我怎樣才能得到的是我想匿名委託通過序列化...忽視或以其他方式?
4.5.11與WebApi一起安裝,我沒想過通過NuGet檢查更新。現在它在5.0.8上工作,所以這是絕對的問題。謝謝,詹姆斯......的答案和Json.NET。 :) –