2012-02-23 9 views
1

私はasp.net MVC 4ベータ版で新しい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プロパティの設定をpublicにします。私はこの動作は入力パラメータでは正常ですが、出力ではないと思います。 IMHOこれをサポートするJSONシリアライザを使用してcould be workaroundedのバグですが、最後のリリースより前に修正し、出力パラメータ用にreadonlyプロパティをシリアル化できるようにしてください。

実際にはビューモデルを使用する必要があるため、ドメインモデルをビューモデルにマップして、実際に公開する必要があるプロパティのみを含むビューモデルを返すようにしてくださいクライアントに送信します。このビューモデルにはパブリックゲッターとセッターのプロパティが含まれます。

+0

これは問題を解決しなかった、または私がhttp://pastebin.com/gN23Axyrを変更したときに別のエラーが発生することを意味します...私が変更した場合、デフォルトのシリアライザがIPageMetadataのシリアル化を処理しないようですそれはPageMetadataに作用します。 BumbyCapsの代わりにjsonを小文字にするために、これを処理できるシリアライザが含まれていますか? – Marcus

+0

インターフェイスをシリアル化することはできませんが、 '[KnownType(typeof(PageMetadata)]'属性を 'PageModel'クラスに置いてみてください。これは、オブジェクト参照型が 'PageMetadata'である限り、' Metadata'プロパティのシリアライゼーションを修正するはずです。 –

関連する問題