多くの人が言うように、愚かな質問はありません。
ここで明らかにした問題は、頻繁に発生するものであり、解決策は私たちが考えているよりも簡単な場合があります。
実際にやりたいことを実現する方法は複数ありますが、私の意見では、JavaScript を使用して PopUp を表示し、Model1 にサブアイテムを追加するのが最適なオプションです。
Model1 が送信されない可能性があるという単純な理由から、SubModel1 アイテムをすぐにデータベースに保存しないでください。
この場合、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");
}
項目とサブ項目を保存する方法は、データにアクセスする方法 (Entity Framework、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);
});
});