C# 从表单提交传递复杂数据?

C# 从表单提交传递复杂数据?,c#,forms,knockout.js,C#,Forms,Knockout.js,我有一个对象数组,每个对象有5个字段,我想在表单提交中发送该数组。但我一直在变空,不知道我做错了什么 <form method="post" ....> <table> <!-- ko foreach: items--> <tr> <td> <span data-bind="text: Category"></span> <input type="hidden" data-bi

我有一个对象数组,每个对象有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)
 {

 }

[HttpPost]
公共项目(列表数据)
{
}
项与javascript对象的JSON匹配


如何将我的项目数组获取到我的C#call中?

您可以在javascript中将listitem序列化为字符串作为参数,并在动作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);
 }
[HttpPost]
公共void MyItems(字符串数据)
{
JavaScriptSerializer parser=新的JavaScriptSerializer();
var info=解析器。反序列化(数据);
}

您必须将提交的JSON数组封装在一个类似“items”的变量中,变量名匹配很重要。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;}
}

问题是您正在发布一个html表单,而不是
JSON
,您需要进入原始表单发布的数据,以获得
JSON
字符串。通常这是通过
请求完成的。表单
?看起来您缺少的是隐藏标记上的
名称
属性。一旦你准备好了,就应该像这样简单:

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

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

字符串json=Request.Form[“MyHiddenElement”];

还有一件事可能会很有帮助,那就是如果你扔掉一些隐藏的标记,并给它们取一个相同的名字,你就可以做一个Request.Form这个名字,然后你会得到一个逗号分隔的数组列表,里面的
你的输入没有名字。。。提交JSON是一种要么全有要么全无的事情,而不是使用传统POST/GET的JSON编码参数。。。在form method=“post”?之后,我似乎无法实现这一点。我得到一个404错误-没有找到与请求匹配的HTTP资源
<input type="hidden" name="MyHiddenElement" data-bind="value:ko.toJSON($data)" />

string json = Request.Form["MyHiddenElement"];
<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"];