我有一个动态添加项目的表单,你只需要一个名字......我使用KnockOut js html看起来像这样:
<div data-bind="foreach: tmgs">
<i>Naam:</i>
<input type="text" required data-bind="value: name" /><br />
</div><br/>
<button class="btn btn-default" data-bind="click: addtmg">New item</button>
<ul data-bind="foreach: tmgs">
<li data-bind="text: name"></li>
</ul>
<button class="btn btn-success" id="Save">Save Item</button>
我使用的JS脚本如下所示:
var model = {
tmgs: ko.observableArray(),
addtmg: function () {
this.tmgs.push({ name: ko.observable() });
}
};
ko.applyBindings(model);
var json = ko.toJSON(model);
$("#Save").click(function (e) {
$.ajax({
url: "@Url.Action("AddItem")",
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(ko.toJS(model.tmgs)),
success: function (status) {
alert(status);
}
});
});
ASP方法如下所示:
[HttpPost]
public JsonResult AddItem(List<string> tmgs)
{
if (tmgs == null)
{
return Json("False");
}
foreach (string item in tmgs)
{
if (!String.IsNullOrEmpty(item))
{
server.CreateItem(item);
}
}
return Json("True");
}
当我运行此代码时,该方法将收到一个列表,但是lst只包含NULL项。我也用过这个:
$("#Save").click(function (e) {
$.ajax({
url: "@Url.Action("AddItem")",
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: ko.toJSON(model).tmgs,
success: function (status) {
alert(status);
}
});
});
和
data: ko.toJSON(model.tmgs),
这次参数也不是列表,只是NULL
我做错了什么?
@nemesv的解决方案
[HttpPost]
public JsonResult AddItem(List<Tmg> tmgs)
{
...
}
public class Tmg
{
public string name { get; set; }
}
在这种情况下,使用data: ko.toJSON(model.tmgs),
发送数据应该可以正常工作。
答案 0 :(得分:1)
您的控制器参数List<string>
与您要发送的数据不匹配,这是一个对象列表,其中包含数据的name
属性
所以你需要发送一个字符串数组,并获得每个tmg的name
属性:
data: JSON.stringify(model.tmgs().map(function(item) { return item.name() })),
或者您需要更改控制器以获取tmg对象列表:
[HttpPost]
public JsonResult AddItem(List<Tmg> tmgs)
{
...
}
public class Tmg
{
public string name { get; set; }
}
在这种情况下,使用data: ko.toJSON(model.tmgs),
发送数据应该可以正常工作。