对从基类继承 href 和 id 的 WebApi 响应模型中的属性 ASP.NET 排序

本文关键字:模型 属性 ASP 排序 NET 响应 WebApi 继承 基类 href id | 更新日期: 2023-09-27 18:37:09

我有一个 ASP.NET Web Api 2项目,其中包含多个响应模型。为了尝试创建较小的有效负载,我为用户提供了将实体折叠为仅 id 和 href 链接的选项,我想自动生成这些链接。我希望我所有的主要资源响应模型都继承自只有hrefid的基本响应模型。如果我有一个资源Foo,这看起来像这样:

public class ResourceResponseModel
{
    public string Href { get; private set; }
    public string Id { get; private set; }
    protected ResourceResponseModel(string id)
    {
        Id = id;
    }
}
public class FooModel : ResourceResponseModel
{
    public string Name { get; private set; }
    private ExampleModel (string id, string name)
        : base(id)
    {
        Name = name;
    }
    internal static FooModel From(Foo foo)
    {
        return new FooModel(
            foo.Id,
            foo.Name
        );
    }
}

调用我的控制器时,此模型使用 Microsoft.AspNet.Mvc.Json(object data)

这似乎工作得很好,除了当我查看我最终得到的响应时,它将基类属性放在最后:

{
    "name": "Foo 1",
    "href": "api/abcdefg",
    "id": "abcdefg"
}

有没有一种简单的方法可以让基本属性显示在资源属性之前?

对从基类继承 href 和 id 的 WebApi 响应模型中的属性 ASP.NET 排序

您可以通过在属性上设置 JsonProperty 属性并传入 Order 来解决此问题。

public class ResourceResponseModel
{
    [JsonProperty(Order = -2)]
    public string Href { get; private set; }
    [JsonProperty(Order = -2)]
    public string Id { get; private set; }
    protected ResourceResponseModel(string id)
    {
        Id = id;
    }
}

Order似乎默认为零,然后在序列化时从低到高排序。可在此处找到文档。