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# 调用?

4

3 回答 3

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);
 }
于 2013-09-27T02:23:34.670 回答
1

您必须将 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;}
}

还有你的 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();
于 2013-10-01T20:53:58.730 回答
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"];
于 2013-10-01T22:09:15.663 回答