Ajax调用ASP post方法继续给出null参数

时间:2017-01-02 13:41:53

标签: c# asp.net ajax asp.net-mvc knockout.js

我有一个动态添加项目的表单,你只需要一个名字......我使用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),发送数据应该可以正常工作。

1 个答案:

答案 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),发送数据应该可以正常工作。