C# ASP.NET嵌套模型列表未绑定
我试图使用ASP.NET的模型绑定和JavaScript操作一系列值,将模型列表发布到服务器。当我将值发送到服务器时,我得到的是:C# ASP.NET嵌套模型列表未绑定,c#,asp.net-mvc,C#,Asp.net Mvc,我试图使用ASP.NET的模型绑定和JavaScript操作一系列值,将模型列表发布到服务器。当我将值发送到服务器时,我得到的是: model.inventory.processed_items[0].id: GA-6570 model.inventory.processed_items[0].event: model.inventory.processed_items[0].subevent: model.inventory.processed_items[0].restrict_mark
model.inventory.processed_items[0].id: GA-6570
model.inventory.processed_items[0].event:
model.inventory.processed_items[0].subevent:
model.inventory.processed_items[0].restrict_marking:
model.inventory.processed_items[0].cecp_string:
model.inventory.processed_items[0].discrepancies:
model.inventory.processed_items.Index: 0
model.inventory.processed_items[1].id: GD-1000
model.inventory.processed_items[1].event:
model.inventory.processed_items[1].subevent:
model.inventory.processed_items[1].restrict_marking:
model.inventory.processed_items[1].cecp_string:
model.inventory.processed_items[1].discrepancies:
model.inventory.processed_items.Index: 1
这些是我绑定到的模型类(我省略了与问题无关的任何字段):
公共类PackageViewModel
{
公共InventoryViewModel清单{get;set;}
}
公共类InventoryViewModel
{
公共列表已处理_项{get;set;}
}
公共类ProcessedItemViewModel
{
公共字符串id{get;set;}
public int@event{get;set;}
公共字符串子事件{get;set;}
公共字符串cecp_字符串{get;set;}
公共字符串restrict_标记{get;set;}
公共字符串差异{get;set;}
公共字符串最高分类{get;set;}
公共整数出现次数\u计数{get;set;}
公共IEnumerable出现次数{get;set;}
}
公共类ProcessedOccrenceView模型
{
公共字符串文本{get;set;}
公共字符串安全性\u num{get;set;}
公共可为空的媒体计数{get;set;}
公共字符串分类{get;set;}
}
这是我的控制器:
[HttpGet]
public ActionResult Create()
{
var inventoryVM = new InventoryViewModel
{
processed_items = new List<ProcessedItemViewModel>()
};
var packageVM = new PackageViewModel {
inventory = inventoryVM
};
return View(packageVM);
}
[HttpPost]
public ActionResult Create(PackageViewModel packageVM)
{
if (ModelState.IsValid)
{
...
}
}
[HttpGet]
公共操作结果创建()
{
var inventoryVM=新的InventoryViewModel
{
已处理的项目=新列表()
};
var packageVM=新的PackageViewModel{
存货=存货虚拟机
};
返回视图(packageVM);
}
[HttpPost]
公共操作结果创建(PackageViewModel packageVM)
{
if(ModelState.IsValid)
{
...
}
}
在调试器中检查packageVM时,这些值不会绑定到视图模型。但是,在POST请求期间,packageVM模型中包含了除此嵌套模型列表之外的其他值。我不明白为什么这部分没有绑定,因为我提供了索引,并且向视图传递了一个空列表。您发送的值的属性名称与您绑定到的模型不匹配
PackageViewModel
不包含名为model
的属性(它包含名为inventory
的属性),因此
model.inventory.processed_items[0].id: GA-6570
这是必须的
inventory.processed_items[0].id: GA-6570
一个简单的思考方法是考虑如何在后方法
中访问模型的属性值。public ActionResult Create(PackageViewModel packageVM)
{
// get the id of the first item in processed_items
string id = packageVM.inventory.processed_items[0].id
因为方法中的参数名为packageVM
,所以只需删除该前缀(即变为inventory.processed\u items[0].id
),这就是绑定数据所需的名称
作为旁注,如果您在
For
循环中使用强类型的***For()
方法来根据模型生成表单控件,它们将生成正确的名称
属性,您可以使用$('form')。serialize()
以正确生成通过ajax调用发送的数据。根据您在服务器上获得的信息,看起来至少ID绑定正确。您可能希望显示一些显示如何创建表单输入的视图代码—这可能是您的问题所在。您发送的数据中的属性名称错误—它的库存。已处理项[0]。id:GA-6570
,而不是模型。库存。已处理项[0]。id:GA-6570
(您的PackageViewModel
dos不包含名为model
的属性)@StephenMuecke谢谢,我没有注意到,您能回答这个问题吗?
public ActionResult Create(PackageViewModel packageVM)
{
// get the id of the first item in processed_items
string id = packageVM.inventory.processed_items[0].id