簡體   English   中英

空數組的默認值數據注釋

[英]Default value data annotation for empty array

我正在創建一個 .NET Core Web API 並想調用端點提交客戶訂單。 客戶 ID 作為路由參數出現。 在請求正文中,可以發送對象數組。 每個 object 都包含產品 ID 及其數量。 但是這個字段是可選的,空訂單也是可能的(產品可以稍后添加)。

所以我從這個 DTO 開始

public class CreateCustomerOrderByIdDto
{
    [FromRoute]
    public uint Id { get; set; }

    [FromBody]
    public OrderPosition[] OrderPositions { get; set; }
}

public class OrderPosition
{
    [Range(1, uint.MaxValue)]
    public uint ProductId { get; set; }

    [Range(1, uint.MaxValue)]
    public uint Amount { get; set; }
}

此請求 DTO 應使OrderPositions字段可選,但在添加項目時,該項目的兩個屬性都是必需的。 如果丟失,我想為OrderPositions設置一個默認值,所以我認為這個數據注釋會做到這一點

[DefaultValue(new OrderPosition[0])]

不幸的是,我收到此錯誤消息

屬性參數必須是屬性參數類型的常量表達式、'typeof()' 表達式或數組創建表達式

那么如何將該字段標記為可選並設置默認值呢?

當不傳遞訂單位置時,數組將被轉換為空的,這樣我就可以避免 null 檢查並使用從未運行過的循環

也許您可以使用List<OrderPosition>而不是數組。 然后在構造函數中將其初始化為空列表

public class CreateCustomerOrderByIdDto
{
    public CreateCustomerOrderByIdDto()
    {
        this.OrderPositions = new List<OrderPosition>();
    }
    [FromRoute]
    public uint Id { get; set; }

    [FromBody]
    public List<OrderPosition> OrderPositions { get; set; }
}

public class OrderPosition
{
    [Range(1, uint.MaxValue)]
    public uint ProductId { get; set; }

    [Range(1, uint.MaxValue)]
    public uint Amount { get; set; }
}

與 hphp 的答案類似,您可以像使用任何 c# class 一樣設置默認值:

public class CreateCustomerOrderByIdDto
{
    [FromRoute]
    public uint Id { get; set; }

    [FromBody]
    public OrderPosition[] OrderPositions { get; set; } = new OrderPosition[0]; // auto-initialize it here. 

    // alternatively you can use a constructor, but I prefer setting the property like above
    public CreateCustomerOrderByIdDto
    {
        OrderPositions = new OrderPosition[0];
    }
}

public class OrderPosition
{
    [Range(1, uint.MaxValue)]
    public uint ProductId { get; set; }

    [Range(1, uint.MaxValue)]
    public uint Amount { get; set; }
}

如果您不喜歡這些想法並且您正在使用 Newtonsoft.Json,您還可以利用序列化事件,並對這些事件執行默認值設置器: https://www.newtonsoft.com/json/help/html /SerializationCallbacks.htm

arrays 的問題在於它具有固定長度。 您可以使用Array.Resize()調整數組的大小,但這也需要固定長度。

更好的方法是使用 List 而不是數組:

public class CreateCustomerOrderByIdDto
{
    [FromRoute]
    public uint Id { get; set; }

    [FromBody]
    public List<OrderPosition> OrderPositions { get; set; }
}

默認情況下,列表 object OrderPositions將具有null值; 這是表示列表中不存在任何項目的好方法。

如果您仍然需要默認列表為空,而不是 null,您可以設置默認值如下:

public List<OrderPosition> OrderPositions { get; set; } = new List<OrderPosition>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM