C# ASP.NET嵌套模型列表未绑定

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

我试图使用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_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