モデルの結合可のデータをコントローラのアクションパラメータ型のリスト<T>

StackOverflow https://stackoverflow.com/questions/2400391

質問

私の強いタイプのビューの種類

List<List<MyViewModelClass>>

外側のリストは常に二つのリスト List<MyViewModelClass>.それぞれの二つの外部リストを表示すグループのチェックします。各セットで任意の数だけます。

私モデルクラスに似てます:

public class MyViewModelClass
{
    public Area Area { get; set; }

    public bool IsGeneric { get; set; }

    public string Code { get; set; }

    public bool IsChecked { get; set; }
}

最終的なビューのように:


を選択してください者に適用される:

最初の選択肢:

  • x オプション1
  • x オプション2
  • x オプション3
  • など。

第二の選択肢:

  • x 第二のオプション1
  • x 第二のオプション2
  • x 第二のオプション3
  • x 第二のオプション4
  • など。

チェックボックスに表示する MyViewModelClass.Area.Name, その値は関連 MyViewModelClass.Area.Id.確認状態の関係 MyViewModel.IsChecked.

質問

どのように思われるでしょうかのどちらを使うべき Html.CheckBox() または Html.CheckBoxFor() ヘルパーを表示私のチェックボックス?取得したこれらの値はサーバー上で可。

いては"コントローラのアクションというところがこれらの:

public ActionResult ConsumeSelections(List<List<MyViewModelClass>> data)
{
    // process data
}

public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
    // process data
}

このままのものより簡便な、という別のデータタイプのように:

public class Options
{
    public List<MyViewModelClass> First { get; set; }

    public List<MyViewModelClass> Second { get; set; }
}

などを変更する私の最初のバージョンのコントローラのアクション:

public ActionResult ConsumeSelections(Options data)
{
    // process data
}
役に立ちましたか?

解決 2

ソリューション

これは全く非常に複雑ではありませんが判明しました。あなたがしなければならないのは、適切にあなたのコントロールを名前であり、それがあるべきようにすべてが一緒にバインドされます。そう。どのようなコントロール、彼らはいつものように名前を付ける必要があります:

name="first[0].propName"
name="first[1].propName"
name="first[2].propName"
name="first[3].propName"
...

// or
name="first[0].data[0].property"
name="first[0].data[1].property"
name="first[0].data[2].property"
...
name="first[1].data[0].property"
name="first[1].data[1].property"
...

これらのすべてのコントローラのアクションパラメータを(1秒は、コレクション内の別のコレクションを持っている)。List<SomeType> firstにバインドされます。

非常に重要な注意事項
あなたが追加した場合は/ Javascriptを使用して動的にこれらのコントロールを削除するには、インデックスが0から連続し始めていることを、確認する必要があり、かつ任意のギャップを持っていません。そして、あなたは、コレクション内の要素の動的な数の素敵な作業のアプリを持っています。

あなたは<のhref = "http://erraticdev.blogspot.com/2010/09/preparing-list-of-objects-so-they-can.html" のrel = "nofollowをnoreferrer" でそれについて読むことができます>私のブログにもを投稿します。

他のヒント

一般的に私は、「モデル」、私が作成したいビューそのタイプ(モデル)を作成します。 すなわちます。

public class FooViewModel
{
    public List<Option> General { get; set; }
    public List<Option> Others { get; set; }

    //Some Methods and other properties
}
public FooController :...
{
    private FooViewModel fooViewModel = new FooViewModel();
}

編集: それは正確だとして、この記事を持っています何をしたい!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top