WebAPI - 传递派生类的JSON

时间:2015-07-23 19:37:05

标签: jquery angularjs entity-framework kendo-ui

我正在使用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或者其他东西。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

当我从模型优先切换到代码优先时,我没有明确地使用TPT继承。从TPH继承切换到TPT后,一切都解决了。