2012-09-22 88 views
1

我故意儘量不使用控制器參數的綁定,所以我有一個控制器,看起來像:發佈JSON到MVC控制器 - 字符串參數爲null

[HttpPost] 
     public ActionResult UntypedForm(String serializedformdata) 
     { 
     //// ... 
     } 

當我發佈系列化的JSON形式元素到控制器用以下代碼:

var formelements = $('#form').serializeArray(); 
$.post(url, formelements, function (data) { 

    }, "json").error(function() { 
     alert("Error posting to " + url); 
    }); 

我得到一個NULL值爲我的控制器上的字符串serializedformdata。但是,當我用強類型對象替換String serializedformdata時,綁定按預期正常工作。

我的控制器的全部內容是通用的JSON帖子,我將創建一個BSON文檔放入Mongo數據庫。所以....我故意不想模型綁定,我想序列化的字符串作爲pamameter。爲什麼我發佈的serializedform數據字符串爲空?

注 - 我也試圖結合辭典

public ActionResult UntypedForm(Dictionary<string,string> serializedformdata) 
      { 
      //// ... 
      } 

但serializedformdata仍然是空。

回答

2

函數serializeArray使用窗體的鍵/值對創建一個Javascript對象。你不希望這樣,你想要一個鍵/值serializedformdata =(JSON字符串)。即,像這樣;

var formelements = { serializedformdata: JSON.stringify($('#form').serializeArray()) }; 

這將原始JSON字符串傳遞給控制器​​的參數。您可以使用JavaScriptSerializer來獲取服務器上的對象:

var obj = (List<Dictionary<string,string>>)new JavaScriptSerializer().Deserialize(serializedformdata, typeof(List<Dictionary<string,string>>)); 
Dictionary<string,string> dict = obj.First(); 
string someval = dict["somekey"]; 
+0

但不與「JSON」的說法進行了自己的字串張貼?我看到你的觀點並同意serializeArray創建一個JS對象,但是肯定該對象是通過post來序列化的? – goldfinger

+1

@goldfinger是的,它是通過發佈序列化的,但它沒有以你想要的方式序列化。 JSON密鑰必須與Action的參數匹配。所以,你可以翻轉我的方法,並將你的動作參數改變爲表單中的'name'屬性,這也應該起作用。 – McGarnagle

+0

很好的解釋 - 非常感謝! – goldfinger

相關問題