经过长时间的研究,没有解决方案,我决定在这里发一个问题。 我正在做的是实现OData读取,写入,更新和删除实体。 所以,现在我能够使用Odata读取,创建和删除实体,但我要求不应该有任何没有参数的公共构造函数(它现在受到保护)。好吧,每当我将公共构造函数更改为protected时,我就会在创建新实体时遇到错误(在ModelState中):{"没有为此对象定义无参数构造函数。"}在{{1 ODataController方法 我想知道是否有一些我可以设置的设置,所以它也会使用受保护的构造函数,就像Newtonsoft JsonConverter那样:
Post
这是我的班级:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
var ODataResult = JsonConvert.DeserializeObject<OData<T>>(entitiesJson, settings);
配置:
public class Product
{
protected Product() { }
public Product(string id, string name)
{
Id = id;
Name = name;
}
public string Id { get; set; }
public string Name { get; set; }
}
Controller的Post方法:
public class ODataConfiguration
{
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.Formatters.JsonFormatter.SerializerSettings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
var builder = new ODataConventionModelBuilder();
builder.EntityType<Product>();
builder.EntitySet<Product>("Product").EntityType.Name = "Product";
config.MapODataServiceRoute("ODataApi", null, builder.GetEdmModel());
appBuilder.UseWebApi(config);
}
}
post方法参数中的实体字段为空,我检查ModelState并看到上面提到的错误。
问题是,我希望OData反序列化器看到受保护的构造函数,或者用Newtonsoft.Json反序列化器替换默认的OData反序列化器。
更新 经过一些研究后,我找到了设置ConstructorHandling的方法,但没有帮助:
public async Task<IHttpActionResult> Post([FromBody]Product entity)
{
return null;
}
我可以研究的任何想法或方向? 谢谢。