簡體   English   中英

如何在定義良好的模型中反序列化動態屬性?

[英]How to deserialize a dynamic property in a well defined model?

我有一個Web api方法定義如下:

[HttpPost]
public void Post(Input model)
{
    ...
}  

使用這樣的輸入模型:

public class Input
{
    public string Id { get; set; }
    public object Extra { get; set; }
}

我想做的就是傳遞一個有效的JSON對象作為額外的參數,例如下面的jQuery示例:

$.post(
    'http://localhost/api/myController',
    { 
        id: 'someId',               
        extra: { 
            tags: ['a', 'b'],
            anotherValue: 'hello',
            oneMore: { 
                foo: 'bar'
            }
        }
    });

ID正確進入了我的model.Id屬性。 但是, 額外的屬性作為{object}出現,由於我不知道其中的內容,因此無法以任何方式反序列化它。

我嘗試使其動態化和/或將其強制轉換為dynamic / ExpandoObject / Dictionary,但未成功。 我知道,如果我只收到原始的HttpRequestMessage並自己處理,就可以使它工作。 但是,我寧願不這樣做,而要依靠.NET進行的所有驗證。

可能嗎?

謝謝

編輯1:在測試了更多替代方案之后,我發現extra屬性沒有任何實際值,它只是被初始化為new object() 看起來默認的模型綁定程序實現不處理動態JSON(至少不是這樣),而只是調用它無法處理的model屬性的默認構造函數。

將屬性定義為object應該可以,或者如果要明確顯示, JObject Extra屬性的類型設置為JObject

但是問題出在$.post請求上。 為了將復雜的數據發布到web.api方法並允許模型綁定,您需要做兩件事:

  • 將內容類型設置為“ application / json”
  • 並通過調用JSON.stringify將數據作為JSON發送

但是使用$.post不能指定內容類型,因此需要使用$.ajax

因此,以下調用應將數據發布到您的操作中:

$.ajax({
    url: 'http://localhost/api/myController',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(
    { 
        id: 'someId',               
        extra: { 
            tags: ['a', 'b'],
            anotherValue: 'hello',
            oneMore: { 
                foo: 'bar'
            }
        }
    })
});

暫無
暫無

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

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