2017-04-21 39 views
2

我有一個C#視圖類如此接收任意JSON對象:在MVC方法

public class DataObject 
{ 
    public int Number { get; set; } 
    public dynamic Data { get; set; } // <----- 
} 

在MVC方法被用於這樣

[HttpPost] 
public ActionResult SaveData(DataObject request) {} 

的問題是,我想收到DataObject類的Data屬性中有多種類型的對象。

也就是說,我希望這兩個工作作爲有效的輸入json對象。

1型

{ 
    Number: 1, 
    Data: { 
     Text: "a text" 
    } 
} 

2型

{ 
    Number: 2, 
    Data: { 
     Value: 1, 
     Options: { 1, 2, 3, 4 } 
    } 
} 

有沒有與任何動態對象或一些其他類型的JSON庫魔術這樣的方式(只是把財產動態什麼也沒做) ?

我想要做的就是將此數據存儲在SQL列nvarchar字段中,並在稍後時間(通過實體框架)返回。

另一種解決方案是爲每種輸入類型創建一個視圖模型,但是會有100個變體創建所有這些視圖,並且相應的輸入方法會很麻煩。

根據評論請求添加更多細節:該方法通過Angular調用。

pub.Save = function (jsonData) { 
    return $http(
      { 
       method: "POST", 
       url: baseURL + "/Save", 
       data: { request: jsonData}, // tried this for string 
       // data: jsonData, // original way 
       timeout: 30000 
      } 
     ) 
     .then(function (result) { 
      return result.data; 
     }); 
} 
+0

只要接受字符串,後來轉換,所以可以直接接受任何JSON字符串? – Krishna

+0

僅將Data設置爲字符串屬性無法捕獲值。它始終爲空。 – JensB

+0

不是整個方法輸入的數據像SaveData(字符串jsonstring) – Krishna

回答

0

在服務器端,DTO類必須與有效載荷所攜帶的相同屬性名稱匹配。

public class DataObject 
{ 
    public string test { get; set; } // <----- 
} 

所以,你的保存方法是一樣的:

[HttpPost] 
public ActionResult SaveData(DataObject request) {} 

有效載荷JSON是在對象request.test但其seralized。 使用Json Library將其去軟件化。

它如何處理多種不同類型的變量?

Deseralize到一個dynamic類型:

dynamic obj = JsonConvert.DeserializeObject(request.test, typeof(object)); 

//Properties within the obj are checked at run time. 
if(obj.Text != null) { 
    //Do your thing 
} 

if(obj.Value != null) { 
    //Do your thing 
} 

if(obj.Options != null) { 
    //Do your thing 
} 
0

通過將數據轉換爲一個JSON字符串在客戶端側,我能夠將其發送到字符串屬性,因而能夠使用相同的爲所有對象鍵入視圖。

當保存對象(我在前端使用角)時,我最終這樣做了,將Json對象轉換爲字符串。

entry.Data = angular.toJson(entryData.Data, false); 

然後,當從MVC返回json字符串時,我這樣做是爲了讓它回到一個真正的javascript對象。

entry.Data = angular.fromJson(entry.Data); 

MVC不會將JSON對象接受到text屬性中,而不首先將其轉換爲json字符串。

使用上面的方法,我在保存我的數據庫這樣的數據:

"{\"Value\":123,\"Currency\":\"EUR\"}"