就像很多人说的那样,没有愚蠢的问题。
您在这里暴露的问题经常发生,解决方案有时比我们想象的要简单。
实际实现您想要做的事情的方法不止一种,但在我看来,为了获得更流畅的体验,使用 JavaScript 显示 PopUp 并将子项添加到 Model1 是最佳选择。
您的 SubModel1 项目不应立即保存在您的数据库中,原因很简单,您的 Model1 可能不会被提交。
在这种情况下,您的 CSS 弹出窗口应该只是页面中存在的表单(div 或其他),并使用 javascript 向 Model1 项目添加新行。
因此,当您提交 Model1 时,它将包含所有修改,包括新的 SubModel1 项。
有一个命名约定用于在提交时允许正确序列化表单。
通过坚持这个绑定,这将允许你在你的控制器中等待你的 Model1。
[HttpPost]
public ActionResult MyPostAction(Model1 item)
{
//do some verification here
if ( ModelState.IsValid )
{
//save your Model1 data
foreach( SubModel1 subitem in item.SubItems )
{
//Save your SubItems here
}
}
return RedirectToAction("Index");
}
您如何保存您的项目和子项目取决于您如何访问您的数据(实体框架、linq-to-sql、经典 ADO.NET 或任何适合您需要的东西)
更多细节:一些关于如何添加新元素的例子
这是您需要添加元素的那种 javascript(这里我使用了一个表格来显示子项)
对于此示例,SubItems 数组的名称如下:
SubItems[0-based index].{SubItem property name}
因此我知道当我添加一个新项目时,新名称将是:
SubItems[SubItems.length].name
SubItems[SubItems.lenght].description
提交后,服务器会将名称绑定到模型中的属性。
您可以在JsFiddle上看到这一点
$(document).ready(function () {
$("#TestButton").click(function () {
var $parent = $("#SubItems");
var $newItem = $parent.find("tr:last").clone();
$parent = $parent.find("tr:last").parent();
var numElem = $parent.find("tr").length;
$newItem.find('[name$="description"]').attr("name", "SubItems[" + numElem + "].description");
$newItem.find('[name$="name"]').attr("name", "SubItems[" + numElem + "].name");
$parent.append($newItem);
});
});