【问题标题】:ASP.NET MVC 4 ApiController doesn't serialize all propertiesASP.NET MVC 4 ApiController 不会序列化所有属性
【发布时间】:2012-02-24 03:53:49
【问题描述】:

我正在 asp.net mvc 4 beta 中测试新的 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
}

是否有可能获得完整的对象而不仅仅是一些东西?

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    只读属性未序列化。如果您希望对其进行序列化,请将 Metadata 属性的设置器设为公开。我认为这种行为对于输入参数是正常的,但对于您的情况来说不是输出。恕我直言,could be workarounded 使用支持此功能的 JSON 序列化程序是一个错误,但也许他们会在最终版本之前修复它并允许为输出参数序列化只读属性。

    实际上这不是什么大问题,因为无论如何您都应该使用视图模型,所以只需将您的域模型映射到一个视图模型并让您的方法返回这个视图模型,它只包含您需要实际公开的属性客户端。此视图模型将包含具有公共 getter 和 setter 的属性。

    【讨论】:

    • 那没有解决问题,或者我的意思是我在更改它时遇到另一个错误pastebin.com/gN23Axyr ...如果我更改它,默认序列化程序似乎无法处理 IPageMetadata 的序列化到 PageMetadata 它工作。是否有更好的序列化程序可以处理这个问题,并且可能使用小写 json 而不是 BumbyCaps 外观?
    • 您无法序列化接口,但您可以尝试在PageModel 类上添加[KnownType(typeof(PageMetadata))] 属性。只要对象引用类型是PageMetadata,这应该会修复Metadata 属性的序列化。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2019-12-19
    • 2021-04-26
    • 2021-05-26
    • 2015-11-12
    • 2014-07-12
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多