2013-09-26 65 views
1

我有一個對象數組,每個對象都有5個字段,我想在表單提交中發送該數組。但我一直收到空,不知道我做錯了什麼。從表單提交複雜數據?

<form method="post" ....> 
<table> 
<!-- ko foreach: items--> 
<tr> 
    <td> 
     <span data-bind="text: Category"></span> 
     <input type="hidden" data-bind="value:ko.toJSON($data)" /> 
    </td> 
</tr> 
<!-- /ko --> 
</table> 
</form> 


[HttpPost] 
public void MyItems(List<Item> data) 
{ 

} 

項目匹配JavaScript對象的JSON。如何獲得我的C#數組項目的數組?

+0

您的輸入沒有名稱...並且提交JSON是一種全部或全部類型的事情,而不是使用傳統POST/GET的JSON編碼參數。 –

+0

你可以在form form =「post」之後加入...嗎? – Kristof

回答

2

您可以將一個listitem序列化爲字符串作爲javascript中的參數,並在動作mvc中將其反序列化。

<form method="post" ....> 
<table> 
<!-- ko foreach: items--> 
<tr> 
    <td> 
     <span data-bind="text: Category"></span> 
     <input type="hidden" value="ko.toJSON($data)" /> 
    </td> 
</tr> 
<!-- /ko --> 
</table> 
</form> 

控制器

[HttpPost] 
public void MyItems(string data) 
{ 
    JavaScriptSerializer parser = new JavaScriptSerializer(); 
    var info = parser.Deserialize<List<Item>>(data); 
} 
+0

我似乎無法得到這個工作。我收到一個404錯誤 - 找不到與請求匹配的HTTP資源 – Zholen

1

你有你的包裹中,如「項目」變量JSON數組的提出,是非常重要的變量名匹配。 ASP.NET會自動將JSON反序列化到你的對象中,不需要手動完成。我已經完全測試過這個,經常做,所以我知道它的工作原理。

[HttpPost] 
// Note how the argument name is "items" 
public ActionResult MyItems(List<Item> items) 
{ 
    // set a breakpoint and check the items List 
    return Content("success") 
} 

public class Item 
{ 
// Make sure to use public properties get/set 
    public string Category {get;set;} 
} 

而JavaScript

function Item() 
{ 
    this.Category = ko.observable(); 
} 

function ViewModel() 
{ 
    this.Items = ko.observableArray(); 

    this.submit = function() { 
     // note how we make sure argument name matches "items" as in Controller 
     var myData = ko.toJSON( { items: this.Items() }); 

     $.ajax({ 
      url: '/Home/MyItems', 
      contentType: 'application/json', 
      type: 'POST', 
      data: myData, 
      success: function(data){ 
       // check result 
      } 
     }) 

    } 
} 

var vm = new ViewModel(); 
ko.applyBindings(vm); 

var item1 = new Item(); 
item1.Category("Cat1"); 
vm.Items.push(item1); 

vm.submit(); 
0

問題是要發佈一個HTML表單,而不是JSON,你將需要進入的原始形式發佈的數據,讓您的JSON串出。通常這是通過Request.Form完成的?它看起來像你的缺失是你的隱藏標籤上的name屬性。一旦你有了到位應該是這樣簡單:

<input type="hidden" name="MyHiddenElement" data-bind="value:ko.toJSON($data)" /> 

string json = Request.Form["MyHiddenElement"]; 

一兩件事,也可能是有益的是,如果你扔了一批隱藏的標籤,並給予他們相同的名字,你可以做一個給定名稱的Request.Form,並且您將返回一個以逗號分隔的<Input隱藏值列表。這對於複雜的數據發佈場景非常有用。

<input type='hidden' name="MyHiddenElement" value="1" /> 
<input type='hidden' name="MyHiddenElement" value="2" /> 
<input type='hidden' name="MyHiddenElement" value="3" /> 

string csvList = Request.Form["MyHiddenElement"];