1

次のようなモデル オブジェクトがあるとします。

public class FooModel
{
    [Required]
    public string Name { get; set; }
    [StringLength(100)]
    public string Description { get; set; }
    public bool HasBar { get; set; }
    public BarModel Bar { get; set; }
}

public class BarModel
{
    [Required]
    public string Name { get; set; }
    [StringLength(100)]
    public string Description { get; set; }
    public bool HasWidgets { get; set; }
    public IEnumerable<WidgetModel> Widgets { get; set; }
}

public class WidgetModel
{
    [Required]
    public string Name { get; set; }
    [StringLength(100)]
    public string Description { get; set; }
    public string Type { get; set; }
    public bool Active { get; set; }
}

そのためのビューを作成したいのですがFooModelHasBar入力がチェックされると、の部分ビューが読み込まれBar、検証が完了します(目立たない)。がチェックされている場合、タイプBarの項目をフォーム データにHasWidgets追加するためのインターフェイスを含む部分ビューが読み込まれます。WidgetModel

フォームの送信ボタンがクリックされると、完全なグラフがコントローラーに渡されます。

Editor Templates でこのようなことができると思ったのですが、私のサブオブジェクトはグラフの一部として解析される方法で名前が付けられていません (それらは事後に追加され、それらがより大きなモデルの一部)。

この種のことをサポートするためのメカニズム/パターンはありますか? 少し再帰的であることはわかっていますが、すべてに適切な名前を付けるために車輪を再発明する必要がありますか?

4

2 に答える 2

1

UI でこの解決策が可能な場合は、最初にすべてのモデルをビューにロードすることをお勧めしますが、「バー」(および「ウィジェット」) セクションを非表示にします (CSS を使用して非表示にします)。次に、JavaScript/jQuery を使用して表示します。

「Bar」が「Foo」プロパティの値 (および「Widget」は「Bar」に応じて) に応じてデータをロードする必要がある場合でも、最初のステップですべての要素をロードし、Javascript または AJAX 呼び出しでそれらを埋める方が常に簡単です。 .

于 2012-06-29T16:53:39.603 に答える
1

以下を作成します。

  • BarModel を返すアクション
  • WidgetModel を返すアクション
  • グラフ全体またはマスター オブジェクトを受け入れるアクション

個々のコンポーネントを取得し、完了したらマスター アクションに送信します。

public JsonResult GetBar(string name)
{
    var bar = //get bar
    return Json(bar);
}

public JsonResult GetWidget(string name)
{
    var widget = //get widget 
    return Json(widget);
}

[HttpPost]
public ActionResult SaveGraph(GraphModel graph)
{
    // save graph.Bar
    // save graph.Widget
    // save graph.Foo

    return ViewResult(graph);   // or redirect, JSON, etc.
}

クライアントでは、元のビューモデルが何であったかに関係なく、オブジェクトを構築して投稿します。

var graph = { Bar: { ... },
              Foo: { ... },
              Widget: { ... } 
            }

$.ajax({ url: '/mycontroller/savegraph',
         method: 'post',
         data: graph,
         success: function(resp) {
             // yay!
         }
      });
于 2012-06-29T20:30:27.173 に答える