2014-03-05 61 views
0

我想提出一個POST Ajax請求使用JSON數據的控制器動作如下圖所示:ASP.NET MVC:接受JSON在行動作爲匿名對象

$.ajax({ 
    type: "POST", 
    url: "/AssembleProducts/UpdateProduct", 
    data: JSON.stringify({ Product: Product }), 
    contentType: "application/json; charset=utf-8", 
    dataType: 'json' 
}); 

的操作方法看起來象下面這樣:

[HttpPost] 
public void UpdateProduct(Product Product) 
{ 

} 

我可以接受JSON數據爲Product,但我希望能夠接受它作爲匿名對象。所以,我不需要Type來接受數據。我嘗試使用dynamicobject關鍵字作爲參數類型而不是Product,但即使在線查找相關主題仍然不成功。

請就這種情況提出建議。

+0

爲什麼要接受'匿名對象'?你試圖達到什麼目的? –

+0

@Murali我正在嘗試從客戶端獲取數據。但有些屬性只是服務器端條件的標誌,所以我不需要它們在我的模型/類型中,並且爲少數標誌屬性創建另一整套DTO似乎對我來說過分了。 – lbrahim

回答

1

怎麼是這樣的:

客戶端:

data: { product: JSON.stringify(Product) } 

服務器端:

string productJson = HttpContext.Current.Request.Form["product"]; 

Product p = new JavaScriptSerializer().Deserialize<Product>(productJson); 
+0

我認爲我在這裏已經做了同樣的事情,我說我已經可以做了。從客戶端發送的某些屬性未映射到我的模型類型,我也不想創建另一個模型來獲取屬性的值。這就是爲什麼我在考慮匿名對象羣體。 – lbrahim

+1

@ Md.lbrahim然後使用'DeserializeObject'代替:http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.deserializeobject (v=vs.110).aspx – Johan

+0

謝謝。 'DeserializeObject'似乎是我正在尋找的。但是我無法獲得整個JSON的字符串。因爲我在'HttpContext'上沒有'Current'屬性。但我試過'HttpContext.Request.Form [「product」]',它返回null。有什麼建議麼? – lbrahim

1

只是讓我明白:我讀這個如下:你有產品型號:

class Product 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
    // etc 
} 

你要張貼與addtional元的產品:

var productJsonObject = { 
    ProductId: 1, 
    ProductName: 'widget', 
    MetaField: 'xyz' 
} 

如果是這樣的話,在你的行動得到MetaField,你可以嘗試直接查詢值提供商:

[HttpPost] 
public void UpdateProduct(Product Product) 
{ 
    var metaField = ControllerContext.Controller.ValueProvider.GetValue("MetaField"); 
} 
+0

謝謝。您的代碼將來會有所幫助。但是JSON中有標誌的層次結構,我只想將整個JSON解析爲「對象」或「匿名」類型。而已。 – lbrahim