我有类型
的强类型视图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; }
}
所以最终的观点看起来像是:
请选择适用的那些:
第一组选择:
第二组选择:
复选框应显示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
}
答案 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中阅读相关内容。