2012-02-23 56 views
1

我在asp.net mvc 4 beta中測試新的ApiController,但是當我嘗試返回類似下面的類時,只有幾個屬性被序列化了?ASP.NET MVC 4 ApiController不會序列化所有屬性

public class PageModel : IPageModel { 
    public string Id { get; set; } 
    public virtual IPageMetadata Metadata { get; private set; } 
    public PageModel() { 
     Metadata = new PageMetadata(); 
    } 
} 

這是我的API控制器

// GET /api/pages/5 
    public PageModel Get(string id) { 
     return new PageModel { Id = "pages/1", Metadata = {Name = "Foo"} }; 
    } 

的代碼,這是結果

{ 
Id: "pages/1", 
Parent: null 
} 

是否有可能獲得完整的對象,而不是隻有幾件事情?

回答

1

只讀屬性未被序列化。如果您希望將其序列化,請將Metadata屬性的setter公開。我認爲這種行爲對於輸入參數是正常的,但對於你的情況不適用於輸出。恕我直言,這是一個錯誤,could be workarounded通過使用支持這個JSON串行器,但也許他們將在最終版本之前修復它,並允許只讀屬性序列化爲輸出參數。

實際上這並不是一個很大的痛苦,因爲無論如何,您應該使用視圖模型,因此只需將您的領域模型映射到視圖模型,並讓您的方法返回此視圖模型,該模型將僅包含實際需要暴露的屬性給客戶。這個視圖模型將包含公有getter和setter的屬性。

+0

那沒有解決問題,或者我的意思是當我改變它時,我得到另一個錯誤http://pastebin.com/gN23Axyr ...它似乎像默認的序列化程序不處理IPageMetadata的序列化,如果我改變它到PageMetadata它的作品。是否有更好的序列化程序包括可以處理這個,也許小寫JSON而不是BumbyCaps的外觀? – Marcus 2012-02-23 19:57:54

+0

你不能序列化一個接口,但是你可以嘗試在'PageModel'類中放置'[KnownType(typeof(PageMetadata))]'屬性。只要對象引用類型是「PageMetadata」,就應該修復'Metadata'屬性的序列化。 – 2012-03-15 13:02:40