2

我对类型有很强的类型观

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
}
4

2 回答 2

0

通常我创建一个类型(模型)来“建模”我想要创建的视图。IE

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控制器操作参数(第二个在集合中有另一个集合)。

非常重要的说明
如果您使用 Javascript 动态添加/删除这些控件,您必须确保索引从 0 开始是连续的,并且没有任何间隙。您将拥有一个不错的工作应用程序,其中包含动态数量的集合中的元素。

您也可以在我的博客文章中了解它。

于 2010-04-11T23:22:07.113 回答