我有一个动态添加项目的表单,你只需要一个名称......我使用 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");
}
当我运行此代码时,该方法将收到一个列表,但第一个列表仅包含 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),
发送数据应该可以正常工作。
最佳答案
您的 Controller 参数不匹配,即 List<string>
以及您发送的数据是一个带有 name
的对象列表包含数据的属性。
所以你需要发送一个字符串数组来获取name
每个 tmg 的属性:
data: JSON.stringify(model.tmgs().map(function(item) { return item.name() })),
或者您需要更改您的 Controller 以获取 tmg 对象列表:
[HttpPost]
public JsonResult AddItem(List<Tmg> tmgs)
{
...
}
public class Tmg
{
public string name { get; set; }
}
在这种情况下使用 data: ko.toJSON(model.tmgs),
发送数据应该可以正常工作。
关于c# - 对 ASP post 方法的 Ajax 调用不断给出 null 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41427966/