2

私はタイプの強いタイプビューを持っています

List<List<MyViewModelClass>>

外側のリストには、常に2つのリストがありList<MyViewModelClass>ます。2つの外側のリストのそれぞれについて、チェックボックスのグループを表示したいと思います。各セットには、任意の数の選択肢があります。

私のビューモデルクラスは次のようになります。

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

選択肢の2番目のセット:

  • x2番目のオプション1
  • x2番目のオプション2
  • x2番目のオプション3
  • x2番目のオプション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
}
4

2 に答える 2

0

通常、作成したいビューを「モデル化」するタイプ(モデル)を作成します。すなわち

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();
}

編集:それはまさにあなたが望むものなので、この投稿を見てください!

于 2010-03-08T10:11:44.643 に答える
0

解決

これはそれほど複雑ではないことがわかりました。コントロールに適切な名前を付けるだけで、すべてが適切にバインドされます。それで。コントロールが何であれ、常に次のような名前を付ける必要があります。

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"
...

これらはすべてList<SomeType> firstコントローラーアクションパラメーターにバインドされます(2番目のパラメーターにはコレクション内に別のコレクションがあります)。

非常に重要な注意事項
Javascriptを使用してこれらのコントロールを動的に追加/削除する場合は、インデックスが0から連続していて、ギャップがないことを確認する必要があります。そして、コレクション内の要素の数が動的である、うまく機能するアプリができあがります。

それについては私のブログ投稿でも読むことができます。

于 2010-04-11T23:22:07.113 に答える