Asp.net mvc 2 将回发数据绑定到列表类型的控制器操作参数的模型<;T>;

Asp.net mvc 2 将回发数据绑定到列表类型的控制器操作参数的模型<;T>;,asp.net-mvc-2,viewmodel,model-binding,generic-list,Asp.net Mvc 2,Viewmodel,Model Binding,Generic List,我对类型有很强的看法 List<List<MyViewModelClass>> 因此,最终视图将类似于: 请选择那些适用的: 第一组选择: x选项1 x选项2 x备选方案3 等等 第二组选择: 第二种选择1 第二种选择2 第二种选择3 第二种选择4 等等 复选框应显示MyViewModelClass.Area.Name,其值应与MyViewModelClass.Area.Id相关。选中状态当然与MyViewModel.IsChecked相关 问题: 我想知道

我对类型有很强的看法

List<List<MyViewModelClass>>
因此,最终视图将类似于:


请选择那些适用的:

第一组选择:

  • x选项1
  • x选项2
  • x备选方案3
  • 等等
第二组选择:

  • 第二种选择1
  • 第二种选择2
  • 第二种选择3
  • 第二种选择4
  • 等等

复选框应显示
MyViewModelClass.Area.Name
,其值应与
MyViewModelClass.Area.Id
相关。选中状态当然与MyViewModel.IsChecked相关

问题: 我想知道应该如何使用
Html.CheckBox()
Html.CheckBoxFor()
helper来显示我的复选框?当然,我必须在回发时将这些值返回到服务器

我希望我的控制器动作如下:

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

public ActionResult ConsumeSelections(List<MyViewModelClass> first, List<MyViewModelClass> second)
{
    // process data
}
通常,我创建一个类型(模型),该类型“建模”我要创建的视图。 i、 e

公共类FooViewModel
{
公共列表常规{get;set;}
公共列表其他{get;set;}
//一些方法和其他属性
}
公共财务总监:。。。
{
私有FooViewModel FooViewModel=新FooViewModel();
}
编辑: 看看吧,这正是你想要的

通常,我会创建一个类型(模型),用于“建模”我要创建的视图。 i、 e

公共类FooViewModel
{
公共列表常规{get;set;}
公共列表其他{get;set;}
//一些方法和其他属性
}
公共财务总监:。。。
{
私有FooViewModel FooViewModel=新FooViewModel();
}
编辑: 看看吧,这正是你想要的

解决方案 事实证明,这一点都不复杂。你所要做的就是适当地命名你的控件,所有的东西都会按它应该的样子绑定在一起。所以无论您的控件是什么,它们的名称应始终如下所示:

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"
...
所有这些都将绑定到第一个列表控制器动作参数(第二个在集合中有另一个集合)

非常重要的注意事项
如果使用Javascript动态添加/删除这些控件,则必须确保索引从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"
...
所有这些都将绑定到第一个列表控制器动作参数(第二个在集合中有另一个集合)

非常重要的注意事项
如果使用Javascript动态添加/删除这些控件,则必须确保索引从0开始是连续的,并且没有任何间隙。你会有一个很好的工作应用程序,在一个集合中有动态数量的元素


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

好的。这只是一个视图模型(我也提出了我的问题)。如何使用其中的数据?显示数据很简单,但是当你想要一个带有复选框的表单返回到服务器时,如何将数据放在视图上。我已经更新了我的帖子,添加了一个链接到一篇我认为你正在寻找的帖子。在某种程度上是这样的,但最终还是自定义绑定。我编辑了我的问题,也包括了我的行动方法…好的。这只是一个视图模型(我也提出了我的问题)。如何使用其中的数据?显示数据很简单,但是当你想要一个带有复选框的表单返回到服务器时,如何将数据放在视图上。我已经更新了我的帖子,添加了一个链接到一篇我认为你正在寻找的帖子。在某种程度上是这样的,但最终还是自定义绑定。我编辑了我的问题,也包括了我的行动方法。。。
public ActionResult ConsumeSelections(Options data)
{
    // process data
}
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();
}
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"
...