我正在使用Kendo UI,Entity Framework和AngularJS,我正在尝试在kendo网格中序列化派生类类型并将其发送到WebAPI方法。我有以下模特协会:
class FREQ_POOL<---- Base class
class POOL_FAA:FREQ_POOL<----derived class
class FREQUENCY(Contains a FREQ_POOL object)
我正在使用带有模型的kendo ui,如下所示:
model: {
id: "Id",
fields: {
Frequency: { type: "string" },
FREQ_POOL: {
$type: 'DomainModelModule.POOL_FAA, DomainModelModule',
// type: "object",
defaultValue: {}
}
}
}
....
$("#FAAFreqGrid").kendoGrid({
dataSource: FAADS,
columns: [
{ field: "Frequency", editor: categoryDropDownEditor, title: "Frequency Test", format: "{0:c}", width: "120px" },
{ field: "FREQ_POOL.FAADesignator", title: "FAA Designator", format: "{0:c}", width: "120px" },
FAADesignator属于派生类POOL_FAA。当我在数据库中手动创建行时,这可以100%正常工作。它是代码中的创建部分无法正常工作。
我根据我读过的内容在web api配置中使用正确的typename处理:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
json.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; //THIS IS NEEDED FOR CASTING
json.SerializerSettings.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
config.Formatters.Remove(config.Formatters.XmlFormatter);
现在我仍然无法在我的WebAPI方法中将我的FREQ_POOL转换为POOL_FAA:
[ResponseType(typeof(FREQUENCY))]
public IHttpActionResult PostFREQUENCY([FromBody]FREQUENCY testfreq)
{
FREQUENCY ftest = new FREQUENCY();
ftest.FREQ_POOL = new POOL_FAA();
POOL_FAA sdgsdg = (POOL_FAA)ftest.FREQ_POOL;//WORKS WHEN MANUALLY CREATED
POOL_FAA pool = (POOL_FAA)testfreq.FREQ_POOL;//THROWS EXCEPTION
}
如您所见,我使用$ type来建立它应该转换的类型,但这似乎不起作用。
我注意到$ type没有出现在我的字符串化json中:
{"Id":0,"Frequency":"","FREQ_POOL":{"FAADesignator":"sdfgsfdg","DateFilled":"dfg","DueDate":"fhg","Released":"sdfh","ReleasedDate":"dsfh","Comments":"sdfh"},
但我包括它所以我不知道它为什么要排除它。这是我最好的猜测,为什么它不起作用。我正在使用Angular和Kendo,因为我的变量在一个剑道模型中,我认为可能会排除$ type或者其他东西。
有什么想法吗?感谢。
答案 0 :(得分:0)
当我从模型优先切换到代码优先时,我没有明确地使用TPT继承。从TPH继承切换到TPT后,一切都解决了。