模型将回发数据绑定到List <t> </t>类型的控制器操作参数

时间:2010-03-08 09:43:56

标签: asp.net-mvc-2 viewmodel model-binding generic-list

我有类型

的强类型视图
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 个答案:

答案 0 :(得分: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();
}

编辑: 看看this post,因为它正是你想要的!

答案 1 :(得分: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开始是连续的,并且没有任何间隙。而且你将拥有一个很好的工作应用程序,其中包含一个集合中动态数量的元素。

您也可以在my blog post中阅读相关内容。