Javascript 无法将表单数据发布到控制器
模型:我有一个地址和名字的集合视图。我知道我错过了一些东西,但我无法理解。我是一个新手,尝试使用mvc创建一些示例。我看到控制器中出现空值。这是小提琴: 视图: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()
名字
弗斯特
中间的
最后
后缀
性别
添加名称
地址
街道
城市
状态
国家
添加地址
拯救
淘汰脚本:
<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 })