2016-08-01 61 views
4

我正在嘗試將屬性名稱中的點反轉JSON反序列化爲鍵值格式。我正在使用內置的ASP.NET MVC模型綁定。它似乎將點解釋爲對象符號,而不僅僅是一個鍵值對象。有什麼方法可以正確地反序列化爲忽略點的關鍵值嗎?這很重要,因爲數據需要以這種格式再次輸出。在屬性名稱中使用點反序列化JSON

控制器動作

[HttpPost] 
public ActionResult SaveProgress(int id, ProgressVM data) 
{ 
    // ProgressVM Data property has an item with key "prop" and a null value, nothing else 
} 

視圖模型

public class ProgressVM 
{ 
    public int ID { get; set; } 
    public Dictionary<string, string> Data { get; set; } 
} 

JSON例

{ 
    "ID": 123, 
    "Data": { 
     "prop.0.name": "value", 
     "prop.0.id": "value", 
     "prop.1.name": "value", 
     "prop.2.name": "value", 
     "prop.3.name": "value" 
    } 
} 
+0

那麼它給你的問題在哪裏?發送數據ckuent-server或反之亦然? –

+0

將數據從客戶端發送到服務器,並在操作方法中進行反序列化。 –

+0

如果不是點用逗號,連字符或分號怎麼辦? –

回答

3

首先,在POST動作傳遞參數的時候,你只傳遞一個參數,而不是多。因此,嘗試創建一個包含Id和ProgressVM模型的模型。

現在,用於反序列化的問題。 JsonValueProviderFactory類似乎有問題,因爲它不綁定ProgressVM模型的嵌套Dictionary<string, string>。我知道,因爲我試圖爲這個模型創建一個ModelBinder,但它在DictionaryValueProvider上失敗,而沒有綁定Data屬性。不幸的是,我沒有找到爲什麼發生這種情況,是JsonValueProviderFactory上的錯誤?我不知道,所以我很快轉到另一個解決方法。

爲什麼不嘗試將JSON字符串賦給控制器而不是模型,然後在控制器的主體中反序列化輸入? 請看下面的例子:

JavaScript代碼,使用jQuery AJAX發佈數據

var data = { 
    "ID": 123, 
    "Data": { 
     "prop.0.name": "value", 
     "prop.0.id": "value", 
     "prop.1.name": "value", 
     "prop.2.name": "value", 
     "prop.3.name": "value" 
    } 
}; 

$.ajax({ 
    url: '@Url.Action("SaveProgress", "Home")', 
    data: { "data": JSON.stringify(data) }, 
    method: "POST" 
}); 

ASP.NET MVC控制器行動

[HttpPost] 
public ActionResult SaveProgress(string data) 
{ 
    var json = JsonConvert.DeserializeObject<ProgressVM>(data); 
    // Rest of code here 
} 

這是回答你的問題?

+0

感謝您的測試,看起來您對我的結果相似。將JSON作爲字符串傳遞並在動作中反序列化肯定會更好。 –

+1

如果我們收到的回覆在屬性名稱中有一個點,該怎麼辦? – Saket

相關問題