ASP.NET 嵌套的模型列表不绑定



我正在尝试使用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

这些是我绑定到的模型类(我省略了任何对问题无关紧要的字段(:

public class PackageViewModel
{
public InventoryViewModel inventory { get; set; }
}
public class InventoryViewModel
{
public List<ProcessedItemViewModel> processed_items { get; set; }
}
public class ProcessedItemViewModel
{
public string id { get; set; }
public int @event { get; set; }
public string subevent { get; set; }
public string cecp_string { get; set; }
public string restrict_marking { get; set; }
public string discrepancies { get; set; }
public string highest_classification { get; set; }
public int occurences_count { get; set; }
public IEnumerable<ProcessedOccurenceViewModel> occurences { get; set; }
}
public class ProcessedOccurenceViewModel
{
public string text { get; set; }
public string security_num { get; set; }
public Nullable<int> media_count { get; set; }
public string classification { 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)
{
...
}
}

当我在调试器中检查 packageVM 时,这些值未绑定到视图模型。但是,在 POST 请求期间,包虚拟机模型中会包含除此嵌套模型列表之外的其他值。我不明白为什么这部分没有约束力,因为我提供了索引并且还传递了一个空列表到视图。

要发送的值的属性名称与要绑定到的模型不匹配。PackageViewModel不包含名为model的属性(它包含一个名为inventory的属性(,因此

model.inventory.processed_items[0].id: GA-6570

它需要

inventory.processed_items[0].id: GA-6570

考虑这一点的一种简单方法是考虑如何在 POST 方法中访问模型属性的值

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_items[0].id(,这就是数据名称需要绑定的内容。

作为旁注,如果您在for循环中使用强类型***For()方法来基于您的模型生成表单控件,它们将生成正确的name属性,您只需使用$('form').serialize()正确生成要通过 ajax 调用发送的数据。

最新更新