2

私はMVC 3にかなり慣れていないので、これが可能かどうかわかりません。そうでない場合、最善のアプローチは次のとおりです。

多くのプロパティと作成ビューを持つ Model1 があります。このページでは、必要なデータを入力して送信します。しかし、私の問題は、Model1 に別のモデル (およびデータベース内の別のテーブル) である SubModel1 も含まれていることです。作成ページにボタンを提供して、ポップアップ CSS フォームを介して「その場で」いくつかの SubModel1 を作成し、SubModel1 が送信されたら、Model1 作成ページを SubModel1 のリストで更新しますが、次のようになります。

  1. Model1 は現在保存されていないため、CSS ポップアップ フォームで送信が完了すると、サブモデルはどこに保存されますか? Model1 モデルに追加できますか? もしそうなら、どのように?
  2. [作成] ページに戻ったら、更新して SubModel1 の名前などをリストに表示するために何をする必要がありますか。
  3. Model1 で送信する場合、Model1 のみを保存する必要があり、残りは自動的に保存されますか、それともコントローラーで自分で正しい順序ですべての保存を行う必要がありますか?

初心者の質問で申し訳ありませんが、とても役に立ちます! ありがとう!

4

1 に答える 1

1

多くの人が言うように、愚かな質問はありません。

ここで明らかにした問題は、頻繁に発生するものであり、解決策は私たちが考えているよりも簡単な場合があります。

実際にやりたいことを実現する方法は複数ありますが、私の意見では、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);
    });
});
于 2012-11-17T20:00:32.937 に答える