【问题标题】:Ajax call to ASP post method keep giving null parameter对 ASP post 方法的 Ajax 调用不断给出空参数
【发布时间】:2017-05-16 15:03:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您的控制器参数 List&lt;string&gt; 与您发送的数据不匹配,该数据是 对象列表,其中 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), 发送数据应该可以正常工作。

    【讨论】:

    • 第二个解决方案似乎有效,第一个仍然给我一个空值列表...但感谢它现在有效:)
    • @Ferryzijl 是的,你是对的我没有注意到name 也是一个可观察的,我错过了map 中的()。所以这应该有效:data: JSON.stringify(model.tmgs().map(function(item) { return item.name() })),
    猜你喜欢
    • 2016-01-12
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多