2017-07-12 71 views
0

我很難找到如何標記需要的複雜對象的成員,我用它作爲我的操作的參數,在.NET Core WebAPI項目中使用Swashbuckle.AspNetCore(通過nuGet包管理器提供最新版本) 。Swashbuckle複雜對象成員裝飾

我已經實現了一個自定義的IOperationFilter,它爲動作參數添加了一個required = true標誌,但顯然它沒有經過複雜的對象定義,所以它們的所有成員仍然被標記爲可選。

我想獲得的是:

definitions: 
    ComplexObjectParameters: 
    description: 'my complex object parameter' 
    type: object 
    required: ['parameter1', 'parameter2'] 
    properties: 
     parameter1: 
     type: string 
     parameter2: 
     type: string 
     parameter3: 
     type: string 

你有任何想法如何,我可以實現這一點?

編輯:一個示範項目,展示了我的問題可以在這裏找到:https://github.com/albator1932/ComplexObjects

+0

故障排除的東西沒有完整的圖片是非常困難的... 你能在GitHub上創建一個簡單的項目來重現你的問題嗎? – HelderSepu

+0

是的,當然,這裏是:https://github.com/albator1932/ComplexObjects 運行該項目和去/ swagger/URL將顯示輸入參數標記爲必需(這是好事),但所有成員被標記爲可選(和一些用於響應)。 – albator1932

+0

我寄給你一個拉... – HelderSepu

回答

0

使用IDocumentFilter並添加[必需]到了所需要的字段:這樣

internal class AddComplexObjectRequiredParameter : IDocumentFilter 
{ 
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) 
    { 
     if (swaggerDoc.Definitions != null) 
     { 
      if (swaggerDoc.Definitions["ComplexObjectParameters"].Required == null) 
       swaggerDoc.Definitions["ComplexObjectParameters"].Required = new List<string>(); 
      foreach (var field in typeof(ComplexObjectParameters).GetFields()) 
      { 
       if (Attribute.IsDefined(field, typeof(RequiredAttribute))) 
        swaggerDoc.Definitions["ComplexObjectParameters"].Required.Add(field.Name); 
      } 
     } 
    } 
} 
+0

謝謝,它的工作原理! 但是,這並不是我想要達到的目的:我有很多對象,有些有很多屬性,所以像這樣列出它們是很乏味的。 有沒有什麼辦法可以創建某種裝飾,我可以添加到對象屬性呢? – albator1932

+0

裝飾者[必填]是要走的路,這應該工作!但是有一個可以打破它的bug。 – HelderSepu

+0

我剛剛對我的建議進行了編輯,以免對成員進行硬編碼,它不應再是一項乏味的任務... – HelderSepu