Javascript 无法将表单数据发布到控制器

Javascript 无法将表单数据发布到控制器,javascript,asp.net-mvc,knockout.js,knockout-mvc,Javascript,Asp.net Mvc,Knockout.js,Knockout Mvc,模型:我有一个地址和名字的集合视图。我知道我错过了一些东西,但我无法理解。我是一个新手,尝试使用mvc创建一些示例。我看到控制器中出现空值。这是小提琴: 视图: 名字 弗斯特 中间的 最后 后缀 性别 添加名称 地址 街道 城市 状态 国家 添加地址 拯救 淘汰脚本: <script> var NameModel = function(names) { var self = this; self.addName = function()

模型:我有一个地址和名字的集合视图。我知道我错过了一些东西,但我无法理解。我是一个新手,尝试使用mvc创建一些示例。我看到控制器中出现空值。这是小提琴:

视图:


名字
弗斯特
中间的
最后
后缀
性别
添加名称
地址
街道
城市
状态
国家
添加地址
拯救
淘汰脚本:

<script>
    var NameModel = function(names) {
        var self = this;
        self.addName = function() {
            self.names.push({
                firstName: "",
                middleName: "",
                lastName: "",
                suffix: "",
                gender: ""
            });
        };
        self.removeName = function(name) {
            self.names.remove(name);
        };
        if (names != null)
            self.names(names);
    };
    var AddressModel = function(addresses) {
        var self = this;
        self.names = ko.observableArray(addresses);

        self.addAddress = function() {
            self.names.push({
                street: "",
                city: "",
                state: "",
                country: ""
            });
        };
        self.removeAddress = function(address) {
            self.names.remove(address);
        };
        if (addresses != null)
            self.names(addresses);
    };
    var viewModel = {
        nameModel: new NameModel([
            {
                firstName: "",
                middleName: "",
                lastName: "",
                suffix: "",
                gender: ""
            }
        ]),
        addressModel: new AddressModel([
            {
                street: "",
                city: "",
                state: "",
                country: ""
            }
        ]),
        save: function () {
            var self = this;
            $.ajax({
                url: '@Url.Action("GetPerson", "Person")',
                type: 'POST',
                contentType: 'application/json',
                data: ko.toJSON({ PersonModel: self
        })
            });
        }
    };
    ko.applyBindings(viewModel);

</script>

var NameModel=函数(名称){
var self=这个;
self.addName=函数(){
self.name.push({
名字:“,
中间名:“,
姓氏:“,
后缀:“”,
性别:“
});
};
self.removeName=函数(名称){
self.names.remove(name);
};
如果(名称!=null)
姓名;
};
var AddressModel=函数(地址){
var self=这个;
self.names=ko.array(地址);
self.addAddress=函数(){
self.name.push({
街道:“,
城市:“,
州:“,
国家:“
});
};
self.removeAddress=函数(地址){
self.names.remove(地址);
};
如果(地址!=null)
姓名(地址);
};
var viewModel={
nameModel:新的nameModel([
{
名字:“,
中间名:“,
姓氏:“,
后缀:“”,
性别:“
}
]),
addressModel:新的addressModel([
{
街道:“,
城市:“,
州:“,
国家:“
}
]),
保存:函数(){
var self=这个;
$.ajax({
url:'@url.Action(“GetPerson”、“Person”),
键入:“POST”,
contentType:'应用程序/json',
数据:ko.toJSON({PersonModel:self
})
});
}
};
应用绑定(视图模型);
这个

我会寄这个

{ PersonModel: { nameModel: { names: [...] }, addressModel: { addresses: [...] } }
{ nameModel: [...], addressModel: [...] }
与你的C#类不匹配。你想寄这个吗

{ PersonModel: { nameModel: { names: [...] }, addressModel: { addresses: [...] } }
{ nameModel: [...], addressModel: [...] }
因为在JSON中,根对象没有命名,并且您的C#类没有
名称
地址
属性。试一试

data: ko.toJSON({ nameModel: self.nameModel.names,
                  addressModel: self.addressModel.addresses })

此外,将名为“GetPerson”的操作发布到控制器上是一个非常糟糕的主意。你的地址模型有一个名为
names
的可观察数组,我认为这是一个复制粘贴错误。

除了第一点,我同意你的所有观点-我相信他的问题是
{PersonModel:self}
中的大写字母。如果控制器操作上只有一个参数,那么他不必提供参数名称,这是绝对正确的,但提供参数名称并不是一种坏做法,因为如果有多个参数,那么始终发送映射到什么的名称是一种好做法。为了澄清我关于大写问题的观点,C#是区分大小写的,名称
PersonModel
不会映射到“不区分大小写的属性反序列化”操作中的参数
PersonModel
,这里没有说他在使用Json.Net-我也是Json.Net的大力支持者,但我认为,关于这一点的讨论超出了最初问题的范围,即一个名为GetPerson的控制器操作实际上保存了一个人,这是一个非常糟糕的命名约定。请将knockout数据属性更改为
{personModel:self}
(小写字母“P”)。此属性名称应与控制器上的参数名称相同,在
{ nameModel: [...], addressModel: [...] }
data: ko.toJSON({ nameModel: self.nameModel.names,
                  addressModel: self.addressModel.addresses })